为啥 foreach 将 refcount 增加 2 而不是 1?

Posted

技术标签:

【中文标题】为啥 foreach 将 refcount 增加 2 而不是 1?【英文标题】:Why does foreach increase refcount by 2 instead of 1?为什么 foreach 将 refcount 增加 2 而不是 1? 【发布时间】:2013-08-12 01:58:12 【问题描述】:

NikiC 在another thread 中声明:

就在 [a foreach] 迭代之前,$array 被“软复制”为 在foreach中使用。这意味着没有实际的复制完成,而只是 $array 的 zval 的 refcount 增加到 2。

但是,我的测试代码显示了不同的结果:

$array = array(0, 1, 2);
xdebug_debug_zval('array'); // refcount=1, is_ref=0
                            // so far so good
foreach ($array as $key => $value) 
    xdebug_debug_zval('array'); // refcount=3, is_ref=0
                               // why is refcount 3 instead of 2?

只看代码,我们最多可以看到两个数组变量。

为什么引用计数是3

为什么 foreach 运行后没有引用计数 2

【问题讨论】:

在你的 foreach 循环中你不应该使用 $value 变量来引用你的数组元素吗? @Crackertastic,我没有在循环中使用任何变量。 我收到refcount 2,我错过了什么吗? array: (refcount=2, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=2, is_ref=0)=2) @vinodadhikary,你没有修改就运行了完全相同的代码?我在 5.3.26,你呢? php 5.5.1,我得到 refcount=2。 【参考方案1】:

xdebug_debug_zval() 正在查看 $array 变量而不是 $key 变量。 如果您将代码更改为:

foreach ($array as $key => $value) 
    echo $key . " : " . $values . "<br>";
    //xdebug_debug_zval('array');


将返回数组的正确值。我没有 xdebug 功能,所以我无法测试你放在那里的值。

【讨论】:

我已经测试了你的代码,xdebug_debug_zval('array'); 仍然显示3 而不是2。我不是在测试数组的值,而是数组的引用计数。 好的。在 foreach 循环中,您需要更改 xdebug... 值。目前,您总是在查看整个数组而不是数组中的项目。 我不想查看数组中的项目...。我正在查看数组,因为 that 就是这个问题的意义所在。为什么数组给出 refcount 3 而不是 2? 正如我所说,我没有 xdebug 的东西。我会将其作为错误报告给插件的创建者。 感谢您提供的信息,但我不需要它,因为我使用 phpED 作为我的 IDE。我仍然会报告这个错误。

以上是关于为啥 foreach 将 refcount 增加 2 而不是 1?的主要内容,如果未能解决你的问题,请参考以下文章

php 变量的分配和销毁

unset与内存容器

refCount 即使发生错误也能保持连接

php垃圾回收机制

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

为啥 forEach 函数不让我返回一个对象,甚至只是将它从函数中传递出去?