在refcount和is_ref之间使用xdebug_debug_zval进行混淆

时间:2017-11-24 08:14:42

标签: php xdebug php-internals

我使用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取消设置引用? :

  

请注意,如果&#34; refcount&#34;是1,&#34; is_ref&#34;总是假的。

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

1 个答案:

答案 0 :(得分:0)

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