为啥 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?的主要内容,如果未能解决你的问题,请参考以下文章