13

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将复制数组,因为如果没有,第$array1 行中的变量将被更改。

但是,唯一需要foreach修改的$array是它的内部数组指针。那么,如果第$array1 行中变量的内部数组指针被更改,为什么会如此重要呢?在片段 1 中无关紧要,为什么在片段 2 中很重要?

为什么foreach需要复制片段 2 中的数组,即使我们没有在循环中修改它?

4

2 回答 2

2

那是因为在第二种情况下,$array是按值传递给函数的test()。因此,在函数内部制作了$arrayforeach()的副本,并在副本上工作。如果$array通过引用传递给 function ,情况会有所不同test()

有关按值传递与按引用传递的信息,请参阅此问题

于 2013-08-11T15:13:59.723 回答
1

您链接到的文章中回答了您的问题。它在章节中给出

未引用,refcount > 1

解释说因为数组指针移动,所以需要结构的副本,这一定不会影响外部数组。

于 2013-08-11T15:00:28.087 回答