代码之家  ›  专栏  ›  技术社区  ›  Mark Baker

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

  •  6
  • Mark Baker  · 技术社区  · 14 年前

    我刚刚对数组运行了一些简单的调试测试,注意到当我对数组执行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。还要注意,这些条目不显示条目的数据类型。

    经过一些实验,如果我变量转储一个标量类型,或者对象或资源,我看不到这一点。如果数组包含字符串数据,则符号为a&(并且它仍然显示数据类型),与float、boolean和object条目相同。

    这是针对php 5.2.8运行的

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

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

    1 回复  |  直到 14 年前
        1
  •  4
  •   Gordon Haim Evgi    14 年前

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

    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 .