为什么foreach在我们没有在循环中修改它时复制数组?

Pac*_*ier 12 php arrays foreach php-internals

在博客文章"PHP Internals:什么时候复制foreach"中,NikiC表示在这样的代码中:

片段1

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

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
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

foreach将复制数组,因为如果没有,第$array1行中的变量将被更改.

然而,唯一foreach修改的$array是它的内部数组指针.那么为什么$array第1行中变量的内部数组指针发生了变化呢?在片段1中没关系,为什么它在片段2中很重要?

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

Sve*_*ven 1

您的问题已在您链接的文章中得到解答。它在章节中给出

未引用,引用计数 > 1

解释说需要结构的副本,因为数组指针移动,并且这不能影响外部数组。