Путаница с использованием xdebug_debug_zval между refcount и is_ref

Я использую 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?:

Обратите внимание, что если refcount равен 1, is_ref всегда FALSE.

PS: OPcache отключен (opcache.enable=0).

1 ответ

К сожалению, поскольку PHP 7 изменил способ внутренней обработки переменных, на самом деле это невозможно xdebug_debug_zval() чтобы дать полностью точные результаты больше.

Другие вопросы по тегам