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

发布于 2024-10-02 12:42:48 字数 932 浏览 3 评论 0原文

我刚刚对数组运行了一些简单的调试测试,并注意到当我对数组执行 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 返回引用计数或引用标志?

I've just been running some simple debug tests against arrays, and noticed that when I do a var_dump() of an array, the output is flagging any element in the array that is referenced by another variable. As a simple experiment, I ran the following code:

$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 />';

which gives the following output:

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) } 

Note the ∫ symbol alongside element 3 and subsequently element 1. Note also that those entries don't show the entry's datatype.

Following some experimentation, I don't see this if I var_dump a scalar type, or with objects or resources. If the array contains string data, the symbol is a & (and it does still show the datatype), likewise with float, boolean and object entries.

This is running against PHP 5.2.8

First question: When did this behaviour start, or is it something that I simply haven't noticed before now?

Second question: If referenced elements can be flagged in this way by var_dump(), is there any function in core PHP that will allow me to identify if an array element is referenced by another variable; or that will return the refcount or ref flag from a _zval_struct?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

胡渣熟男 2024-10-09 12:42:48

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

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) 
} 

另请参阅此 Derick Rethans(PHP 核心开发人员)撰写的关于引用计数的文章

Not sure if this answers your question, but you can use

debug_zval_dump($array);

to get the refcount:

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

Also see this Article by Derick Rethans (PHP Core Dev) about Refcounting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文