意外的观察:数组的var_dump()标记引用的元素......从什么时候开始?

Mar*_*ker 7 php reference var-dump

我刚刚对数组运行了一些简单的调试,并注意到当我执行数组的var_dump()时,输出会标记数组中由另一个变量引用的任何元素.作为一个简单的实验,我运行了以下代码:

$array = range(1,4);

var_dump($array);
echo '<br />';

foreach($array as &$value) {
}

var_dump($array);
echo '<br />';

$value2 = &$array[1];

var_dump($array);
echo '<br />';
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> ?(4) } 
array(4) { [0]=> int(1) [1]=> ?(2) [2]=> int(3) [3]=> ?(4) } 
Run Code Online (Sandbox Code Playgroud)

注意?元素3旁边的符号和随后的元素1.还请注意,这些条目不显示条目的数据类型.

经过一些实验,如果我使用var_dump标量类型,或者使用对象或资源,我都不会看到这个.如果数组包含字符串数据,则符号为&(并且它仍然显示数据类型),同样具有float,boolean和object条目.

这是针对PHP 5.2.8运行的

第一个问题:这种行为是什么时候开始的,或者是我之前没有注意到的事情?

第二个问题:如果引用元素可以通过var_dump()以这种方式标记,那么核心PHP中是否有任何函数可以识别数组元素是否被另一个变量引用; 或者将从_zval_struct返回refcount或ref标志?

Gor*_*don 5

不知道这是否能回答您的问题,但是您可以使用

debug_zval_dump($array);
Run Code Online (Sandbox Code Playgroud)

获取引用计数:

array(4) refcount(2){ 
    [0]=> long(1) refcount(1) 
    [1]=> &long(2) refcount(2) 
    [2]=> long(3) refcount(1) 
    [3]=> &long(4) refcount(2) 
} 
Run Code Online (Sandbox Code Playgroud)

另请参阅Derick Rethans(PHP Core Dev)的有关Refcounting的本文