5

単一の匿名関数への複数の参照を格納する配列があります:

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

ご覧のとおり、無名関数を1 つだけ作成しています。

ループの中に関数宣言を入れるとどうなるでしょうか? :

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

エンジンは、作成する必要があるオブジェクトが 1 つだけであることを認識できるほどスマートですか?

上記のコードはオブジェクトを 1 つだけ作成しますか、それとも反復ごとに 1 つのオブジェクトを作成しますか?

(質問は、HHVM と Zend Engine の両方を対象としています。)

4

1 に答える 1

5

ループ内で関数を作成すると、300 個の個別の無名関数オブジェクトが作成されます。PHP はこれを最適化するわけではありません。これは、ループの前に一度関数を作成するよりもはるかに効率的ではありません。

2 つの独立したオブジェクトが作成されることの証明を次に示します: http://3v4l.org/f3cdE

于 2013-08-05T05:55:00.563 に答える