【问题标题】:Spl, ArrayObject, ArrayObject::STD_PROP_LISTSpl、ArrayObject、ArrayObject::STD_PROP_LIST
【发布时间】:2013-01-14 15:22:54
【问题描述】:

我试图理解文档中的 STD_PROP_LIST 常量,但到目前为止我不明白,也没有找到任何解释:( 该文档有以下示例:

$a = new ArrayObject(array(), ArrayObject::STD_PROP_LIST);
$a['arr'] = 'array data';                             
$a->prop = 'prop data';                               
$b = new ArrayObject();                                   
$b['arr'] = 'array data';                             
$b->prop = 'prop data';                               

// ArrayObject Object                                     
// (                                                      
//      [prop] => prop data                               
// )                                                      
print_r($a);                                              

// ArrayObject Object                                     
// (                                                      
//      [arr] => array data                               
// )                                                      
print_r($b);

两次打印都给了我相同的确切结果:

ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] =>      array data ) ) 
ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) )

任何人都可以帮助我理解使用这个常量有什么区别?

提前致谢!

【问题讨论】:

    标签: php spl arrayobject


    【解决方案1】:

    ArrayObjectArrayIterator 是两个非常相似的类。它们实际上都在 php 核心内部共享大量代码。这两个类有一个内部数组来存储您为这些类设置的元素。

    STD_PROP_LIST 告诉我们如何阅读,ARRAY_AS_PROPS 告诉我们如何编写这些元素。首先,通过标准数组 ([]) 表示法设置元素将始终以相同的方式工作,无论这些设置如何。

    设置ARRAY_AS_PROPS 标志时,这意味着当您设置属性时(通过->),不会像您对常规对象所期望的那样在对象上设置属性,而是将其存储为内部元素。如果未设置此标志,它将将该属性存储到实际的数组对象或数组迭代器中,这就是您在示例代码输出中看到的内容:“prop => propdata”不在storage:ArrayObject:private 内,如果设置了 ARRAY_AS_PROPS 标志就会出现这种情况:

    $a = new ArrayObject();
    $a['arr'] = 'array data';
    $a->prop = 'prop data';
    
    $b = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
    $b['arr'] = 'array data';
    $b->prop = 'prop data';
    
    print_r($a);
    print_r($b);
    
    // Output:
    ArrayObject Object
    (
        [prop] => prop data
        [storage:ArrayObject:private] => Array
            (
                [arr] => array data
            )
    )
    ArrayObject Object
    (
        [storage:ArrayObject:private] => Array
            (
                [arr] => array data
                [prop] => prop data
            )
    )
    

    STD_PROP_LIST 决定在特定条件下返回什么,尤其是在var_dump()。虽然还会有其他情况,但我自己还没有找到。如果设置了STD_PROP_LIST,它将返回已设置到您的ArrayObjectArrayIterator 类的属性。如果未设置,则var_dump() 将返回已存储的内部元素列表。

    STD_PROP_LIST 上的实际文档并非 100% 正确。此标志影响var_dump(),但不影响foreach()。使用foreach() 时,它总是会迭代内部元素,而不是实际属性,即使STD_PROP_LIST 已设置。

    这两个标志不是互斥的:你可以设置两个标志,但这样做没有多大意义:这意味着属性总是作为内部元素添加(ARRAY_AS_PROPS),我们想要返回通过var_dump (STD_PROP_LIST) 的标准属性。由于无法设置属性,因此在这种情况下它将始终返回一个空列表。

    【讨论】:

    • 您应该将此答案放在 PHP 文档 cmets 中,因为它阐明了很多关于 ArrayObject 标志的信息。即使在文档中我也没有找到这种解释。非常感谢!
    • 这太令人困惑了,但这是我找到的最好的解释。
    【解决方案2】:

    @JayTaph 的回答很好,但print_r 更像是一个调试功能。要实际使用数组,例如 foreach,很明显两者有很大不同:

    $a = new ArrayObject();
    $a['arr'] = 'array data';
    $a->prop = 'prop data';
    
    $b = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
    $b['arr'] = 'array data';
    $b->prop = 'prop data';
    
    echo "\$a:<br>\n";
    foreach( $a as $key=> $value) {
      printf( "[%s] : %s<br>\n", $key, $value);
    }
    
    echo "\$b:<br>\n";
    foreach ($b as $key => $value) {
      printf("[%s] : %s<br>\n", $key, $value);
    }
    

    将输出:

    $a:
    [arr] : array data
    $b:
    [arr] : array data
    [prop] : prop data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2010-11-26
      • 1970-01-01
      • 2017-01-15
      • 2014-05-01
      相关资源
      最近更新 更多