在 refcount 和 is_ref 之间使用 xdebug_debug_zval 混淆

Posted

技术标签:

【中文标题】在 refcount 和 is_ref 之间使用 xdebug_debug_zval 混淆【英文标题】:Confusion using xdebug_debug_zval between refcount and is_ref 【发布时间】:2018-05-08 05:08:19 【问题描述】:

我使用 xdebug_debug_zval 来了解 php 5 和 PHP 7 之间的引用是如何变化的。

<?php
$array = array('k1', 'k2', 'k3');

echo PHP_VERSION. '<br/>';
foreach ($array as &$ref) 

unset($ref);

xdebug_debug_zval('ref');
xdebug_debug_zval('array');

PHP 5.5.9-1ubuntu4.14:

5.5.9-1ubuntu4.14
array:
(refcount=1, is_ref=0),
array (size=3)
  0 => (refcount=1, is_ref=0),string 'k1' (length=2)
  1 => (refcount=1, is_ref=0),string 'k2' (length=2)
  2 => (refcount=1, is_ref=0),string 'k3' (length=2)

PHP 7.0.8-0ubuntu0.16.04.3:

7.0.8-0ubuntu0.16.04.3
ref:
(refcount=0, is_ref=0)*uninitialized*
array:
(refcount=1, is_ref=1)
array (size=3)
  0 => (refcount=1, is_ref=1)string 'k1' (length=2)
  1 => (refcount=1, is_ref=1)string 'k2' (length=2)
  2 => (refcount=1, is_ref=1)string 'k3' (length=2)

为什么在 PHP 7 中 is_ref 等于 1 知道我已取消设置引用并根据 PHP documentation ? :

请注意,如果“refcount”为 1,“is_ref”始终为 FALSE。

PS:OPcache 已禁用 (opcache.enable=0)。

【问题讨论】:

【参考方案1】:

不幸的是,由于 PHP 7 改变了内部处理变量的方式,xdebug_debug_zval() 不可能再提供完全准确的结果。

【讨论】:

感谢您的回复。你能给我一些资料,以便我了解它的变化方式吗?

以上是关于在 refcount 和 is_ref 之间使用 xdebug_debug_zval 混淆的主要内容,如果未能解决你的问题,请参考以下文章

PHP垃圾回收机制

掌握PHP垃圾回收机制

php7中is_ref__gc的替代品是啥

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

使用 Tcl C API 的 Lib 可能由于错误的 refCount 使用而崩溃

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