关于循环:PHP’foreach’如何实际工作?

How does PHP 'foreach' actually work?

本问题已经有最佳答案,请猛点这里访问。

我有一个问题暂时无法解释。众所周知,PHP中的foreach与数组的副本一起工作,即它先复制数组,然后迭代数组。一切都很好。但这很奇怪:

1
2
3
4
5
6
$array = ['foo' => 1];
foreach($array as $k => & $v)
{
   $array['bar'] = 2;
   echo $v;
}

这将导致1。接下来,如果我们向数组中添加另一个元素(只是为了确保,我们将在单独的文件中运行此代码,这样它就不会影响refcount或这些测试用例的任何其他内容):

1
2
3
4
5
6
$array = ['foo' => 1, 'bar' => 2];
foreach($array as $k => & $v)
{
   $array['baz'] = 3;
   echo $v;
}

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

我的问题是这个伟大问题的延续。是的,我知道复印是如何工作的。但两种情况下我们都有相同的refcount。为什么结果不一样,目前我无法理解。