我有一个我现在无法解释的问题。众所周知,PHP中的foreach
与数组的 copy 一起工作,即它首先复制数组然后迭代它。一切都很好,花花公子。但这很奇怪:
$array = ['foo' => 1];
foreach($array as $k => & $v)
{
$array['bar'] = 2;
echo $v;
}
这将导致1
。接下来,如果我们向数组中添加另一个元素(为了确保,我们将在单独的文件中运行此代码,因此它不会影响refcount
或其他任何针对这些测试用例的内容):
$array = ['foo' => 1, 'bar' => 2];
foreach($array as $k => & $v)
{
$array['baz'] = 3;
echo $v;
}
宾果!我们已打印1
,2
和3
。为什么?如果PHP通过引用在数组上工作,那么对于第一种情况,它应该导致1
和2
。如果PHP使用副本,那么对于第二种情况,它应该导致1
和2
(没有3
)。
我的问题是this great question的延续。是的,我知道复制是如何工作的。但是对于这两种情况,我们都有refcount
。为什么结果不同,目前还不能理解。