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

Posted

技术标签:

【中文标题】意外观察:数组的 var_dump() 正在标记引用的元素......从啥时候开始?【英文标题】:Unexpected observation: var_dump() of an array is flagging referenced elements... since when?意外观察:数组的 var_dump() 正在标记引用的元素......从什么时候开始? 【发布时间】:2011-05-10 19:03:00 【问题描述】:

我刚刚对数组运行了一些简单的调试测试,并注意到当我对数组执行 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 />';

给出以下输出:

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)  

注意元素 3 旁边的 ∫ 符号,然后是元素 1。另请注意,这些条目不显示条目的数据类型。

经过一些实验,如果我 var_dump 一个标量类型,或者对象或资源,我看不到这一点。如果数组包含字符串数据,则符号为 &(它仍然显示数据类型),浮点数、布尔值和对象条目也是如此。

这是针对 php 5.2.8 运行的

第一个问题:这种行为是从什么时候开始的,还是我以前根本没有注意到的?

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

【问题讨论】:

【参考方案1】:

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

debug_zval_dump($array);

获取引用计数:

array(4) refcount(2) 
    [0]=> long(1) refcount(1) 
    [1]=> &long(2) refcount(2) 
    [2]=> long(3) refcount(1) 
    [3]=> &long(4) refcount(2) 
 

另见Article by Derick Rethans (PHP Core Dev) about Refcounting。

【讨论】:

以上是关于意外观察:数组的 var_dump() 正在标记引用的元素......从啥时候开始?的主要内容,如果未能解决你的问题,请参考以下文章

意外的标记。构造函数、方法、访问器或属性应为角度 5

浮点到 int 类型转换的 PHP 意外结果

语法错误:意外标记“-”

意外标记 `' ` 附近的语法错误

SyntaxError:意外的标记静态

CSS 模块 - 意外标记