PHP-将匿名函数作为参数传递

时间:2019-07-14 11:42:27

标签: php

是否可以在PHP中将匿名函数作为参数传递?如果可以,怎么办?

我正在尝试将匿名函数传递给setter,该setter将使用该函数返回的值填充数组。

class MyClass
{
    private $arr = array();

    public function __construct()
    {
        $this->setArrElm('New', function(){return 123;});
    }

    private function setArrElm($name, $val)
    {
        // here: gettype($val) == object
        $this->arr[$name] = $val;
    }
}

请注意注释-val的类型是object,我希望是int。

1 个答案:

答案 0 :(得分:0)

在PHP 7中,您可以自行执行闭包

<div class="row">
  <div class="col-md-4 col-sm-4 text-center animate-box">
    <div
      class="work-grid"
      id="logosera"
      style="background-image: url(images/logo-biocentru.png);"
    >
      <img id="logosera" src="images/logo-biocentru.png" style="display:none" />
      <div class="desc">
        <h3><a href="#">Carti vizita</a></h3>
        <span class="cat">Graphic Design</span>
        <p>
          <span class="download">
            <a href="#logosera" download="biocentru.png">
              <i class="icon-download"></i>
            </a>
          </span>
          <span class="love">
            <a href="#"><i class="icon-heart"></i></a>
          </span>
        </p>
      </div>
    </div>
  </div>
</div>

输出

class MyClass
{
    private $arr = array();

    public function __construct()
    {
        $this->setArrElm('New', (function(){return 123;})()); //<-- self execute
    }

    private function setArrElm($name, int $val) //<-- added typehint
    {
        // here: gettype($val) == object
        $this->arr[$name] = $val;
        print_r($val);
    }
}

new MyClass;

Sandbox

这采用类似于JS(可能也是其他语言)的形式:

123

重要的是要知道它正在执行函数,然后传递结果。您可以传递闭包(它是一个对象),然后执行它。但是,如果您有严格的类型并且需要一个int,则也可以自行执行闭包。

只有在需要int作为参数的情况下,这样做才有意义。即使在这种情况下,您也可以事先执行它,然后传递结果。这只会为您节省一个局部变量。

对于< PHP7 或仅仅是因为

Alt1

 (function(){return 123;})()

Alt2

class MyClass
{
    private $arr = array();

    public function __construct()
    {
        $var = function(){return 123;};

        $this->setArrElm('New', $var()); //<-- execute
    }

    private function setArrElm($name, $val) //<-- added typehint
    {
        // here: gettype($val) == object
        $this->arr[$name] = $val;
        print_r($val);
    }
}

new MyClass;

Alt3

class MyClass
{
    private $arr = array();

    public function __construct()
    {
        $var = function(){return 123;};

        $this->setArrElm('New', $var); 
    }

    private function setArrElm($name, $val) //<-- mixed
    {
        if(gettype($val) == 'object' && is_a($val, '\Closure')){
             //is a closure, you could use is_callable etc. too. see __invoke()

            $val = $val();
        }
        $this->arr[$name] = $val;
        print_r($val);
    }
}

new MyClass;

欢呼