为什么在foreach循环中不对数组进行修改时,它还是会复制数组?

24 浏览
0 Comments

为什么在foreach循环中不对数组进行修改时,它还是会复制数组?

这个问题已经在此处有了答案:

PHP ‘foreach’实际上是如何工作的?

在一篇博客“PHP内部:什么时候foreach会复制”中,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会复制数组,因为如果不这样做,第1行中的$array变量将被更改。

然而,foreach修改的唯一一件事情是修改$array的内部数组指针。那么,既然在片段1中更改了$array的内部数组指针并不重要,为什么在片段2中重要呢?

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

您的问题已经在您链接的文章中得到解答。它在以下部分中有所说明:

未引用, 引用计数 > 1

该说明解释说需要复制这些结构的副本,因为数组指针会移动,这不应影响外部数组。

0
0 Comments

这是因为在第二种情况下,$array被传递给函数test()时是按值传递的。因此,在函数内部创建了一个$ array的副本,并且foreach()在副本上运行。如果将$array按引用传递给函数test(),则情况将有所不同。

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

0