在一篇博客文章《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
变量的内部数组指针改变,为什么会有影响呢?在代码段1中并没有关系,为什么在代码段2中就有关系了?为什么foreach
需要复制在循环中未修改的数组(即代码段2)?
$array
变量在foreach
循环发生的函数作用域中没有定义。这里有一个混淆点是,foreach
不会复制
$array
,更好的说法是它将被test()函数
复制,但这并不完全正确。因为当foreach
迭代数组时,它必须访问其内部指针以获取key
和value
,因此,它必须在副本或原始副本上工作。 - user1646111