php - PHP引擎是否优化循环内的匿名函数?

标签 php closures anonymous-function hhvm php-internals

我有一个数组,它存储对单个 anonymous function 的多个引用:

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

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

如果我们将函数声明放在循环内会怎么样? :

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

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

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

(问题同时针对 HHVM 和 Zend Engine。)

最佳答案

如果您在循环内创建函数,您将创建 300 个独立的匿名函数对象。 PHP 不会对此进行优化,因为也许这就是您想要的。这比在循环之前创建一次函数效率要低很多

这是创建了两个独立对象的证明:http://3v4l.org/f3cdE

关于php - PHP引擎是否优化循环内的匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18051368/

相关文章:

Javascript - 如何将匿名方法作为变量调用并访问其属性和方法?

php - Zend Framework,传递变量查看

javascript - 闭包/作用域 JavaScript/jQuery

javascript - 为什么 John Resig 的 JavaScript 需要第二个闭包?

javascript - 对 Javascript 闭包案例感到困惑

循环内的 JavaScript 闭包 – 简单的实际示例

arrays - 在 julia 0.4 中工作的匿名函数数组,在 0.5.1 中不工作

php - 如何在sql中链接这两个表

php - Laravel4 验证器和可空字段

php - 在 symfony2 中为特定 Controller 设置 max_execution_time