【问题标题】: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。

标签: php foreach xdebug php-internals


【解决方案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。我仍然会报告这个错误。
猜你喜欢
  • 2011-05-12
  • 2018-12-10
  • 2019-09-14
  • 2018-09-30
  • 2017-06-16
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多