foreach如何运作?

时间:2014-04-15 08:38:22

标签: php foreach php-internals

我有一个我现在无法解释的问题。众所周知,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;
}

宾果!我们已打印123。为什么?如果PHP通过引用在数组上工作,那么对于第一种情况,它应该导致12。如果PHP使用副本,那么对于第二种情况,它应该导致12(没有3)。

我的问题是this great question的延续。是的,我知道复制是如何工作的。但是对于这两种情况,我们都有refcount。为什么结果不同,目前还不能理解。

0 个答案:

没有答案