ブログ投稿「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
}
foreach
foreach
変更する$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
配列がコピーされない場合、$array
1 行目の変数が変更されるため、配列がコピーされます。
ただし、唯一foreach
変更$array
されるのは、内部配列ポインターです。$array
では、 1 行目の変数の内部配列ポインターが変更されると、なぜ問題になるのでしょうか? スニペット 1 では問題にならなかったのに、なぜスニペット 2 では問題になったのでしょうか?
foreach
ループで配列を変更していないのに、なぜスニペット 2 で配列をコピーする必要があるのでしょうか?