NikiC在一篇博文“PHP Internals: When does foreach copy”中指出,在这样的代码中:
片段 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 中的数组,即使我们没有在循环中修改它?