13

ブログ投稿「PHP Internals: When does foreach copy」で、NikiC は次のようなコードで次のように述べています。

スニペット 1

$array = range(0, 100000);
foreach ($array as $key => $value) {
    xdebug_debug_zval('array'); // array is not copied, only refcount is increased
}

foreachforeach変更する$arrayのは内部配列ポインターだけであるため、配列はコピーされません。

彼はまた、次のようなコードで次のように述べています。

スニペット 2

$array = range(0, 100000); // line 1
test($array);
function test($array) { 
    foreach ($array as $key => $value) { // line 4
        xdebug_debug_zval('array'); // array is copied, refcount not increased
        // ...
    }
}

foreach配列がコピーされない場合、$array1 行目の変数が変更されるため、配列がコピーされます。

ただし、唯一foreach変更$arrayされるのは、内部配列ポインターです。$arrayでは、 1 行目の変数の内部配列ポインターが変更されると、なぜ問題になるのでしょうか? スニペット 1 では問題にならなかったのに、なぜスニペット 2 では問題になったのでしょうか?

foreachループで配列を変更していないのに、なぜスニペット 2 で配列をコピーする必要があるのでしょうか?

4

2 に答える 2

1

あなたの質問は、リンク先の記事で回答されています。それはセクションで与えられます

参照されていません。refcount > 1

配列ポインターが移動するため、構造体のコピーが必要であり、これは外部配列に影響を与えてはならないという説明があります。

于 2013-08-11T15:00:28.087 に答える