PHP引擎是否优化循环中的匿名函数?

Pac*_*ier 5 php closures anonymous-function php-internals hhvm

我有一个数组存储对单个匿名函数的多个引用:

$fns = array();
//some code
$fn = function(){
    echo 'this is closure 12345... < 67890';
    // etc etc..
};
for($x=12345; $x<67890; ++$x){
    $fns[$x] = $fn;
}
Run Code Online (Sandbox Code Playgroud)

可以看出,我们只创建了一个匿名函数.

如果我们把函数声明放在循环中怎么办?:

$fns = array();
//some code
for($x=12345; $x<67890; ++$x){
    $fns[$x] = function(){
        echo 'this is closure 12345... < 67890';
        // etc etc..
    };
}
Run Code Online (Sandbox Code Playgroud)

引擎是否足够智能以识别只需要创建一个对象?

上面的代码是仅创建一个对象还是每次迭代创建一个对象?

(问题针对HHVM和Zend Engine.)

dec*_*eze 5

如果在循环内创建函数,则创建300个单独的匿名函数对象.PHP并没有优化它,因为也许这就是你想要的.这是很多比循环之前曾经创建功能效率较低.

以下是创建两个独立对象的证据:http://3v4l.org/f3cdE

  • PHP要求您使用`use(<vars>)`声明来声明应该在闭包中引用的外部变量.解析器可以很容易地告诉该函数没有这个选项,所以它们都是相同的. (4认同)
  • 因为PHP首先必须分析函数是否完全相同*.不可靠性不是问题,*相同*是.如果你在闭包中包含了一些外部变量,那就很难说了.无论哪种方式,PHP*都不会*,无论它是*应该*.PHP几乎完成了你告诉它的事情; 这不像Haskell那样高度抽象的语言. (2认同)