Spl, ArrayObject, ArrayObject::STD_PROP_LIST

2022-08-30 14:07:15

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

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

提前致谢!


答案 1

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

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

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

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

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


答案 2

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

$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

推荐