29

我试图理解文档中的 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 ) )

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

提前致谢!

4

2 回答 2

87

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设置了,它将返回已设置到您的ArrayObject, 或ArrayIterator类的属性。如果未设置,var_dump()则将返回已存储的内部元素列表。

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

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

于 2013-05-17T23:21:07.753 回答
0

A great answer by @JayTaph but print_r is more like a debug function. To actually use the arrays in for instance a foreach it becomes clear that the both differ significantly:

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

will output:

$a:
[arr] : array data
$b:
[arr] : array data
[prop] : prop data
于 2021-11-17T12:02:45.287 回答