gpt4 book ai didi

php - 当我们在循环中没有修改数组时,为什么 foreach 会复制数组?

转载 作者:行者123 更新时间:2023-12-03 01:50:44 26 4
gpt4 key购买 nike

在博客文章中"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 中的数组,即使我们没有在循环中修改它?

最佳答案

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

有关按值传递与按引用传递的信息,see this question

关于php - 当我们在循环中没有修改数组时,为什么 foreach 会复制数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com