PHP的ArrayIterator
和ArrayObject
的构造函数有一个flags
参数,在ArrayObject::setFlags()
中记录如下:
ArrayObject::STD_PROP_LIST
当以列表形式访问时,对象的属性具有正常的功能(var_dump,foreach等)。
ArrayObject::ARRAY_AS_PROPS
可以作为属性(读取和写入)访问条目。
ArrayIterator :: setFlags()的文档类似(the difference being difference erroneous)。
现在,我非常了解第二个标记,它允许使用->
进行属性访问以及使用[]
进行数组访问:
$a = new ArrayIterator(array('foo'=>1), ArrayObject::ARRAY_AS_PROPS);
var_dump($a['foo']);
var_dump($a->foo);
int(1)
int(1)
但我无法绕过ArrayObject::STD_PROP_LIST
。就我测试而言,var_dump
和foreach
在有或没有此标志的情况下表现完全相同。我在这里缺少什么?
答案 0 :(得分:1)
如PHP手册中的the comments所述,该标志会导致属性,而不是var_dump
中可见的数组值。
对于这一点的信用转到PHP手册中的the commenter:
<?php
$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);
?>
这种行为可能在从不发布的PHP版本中发生了变化,因为我的PHP版本(5.4.6)总是同时显示:属性和数组值:
ArrayObject Object
(
[prop] => prop data
[storage:ArrayObject:private] => Array
(
[arr] => array data
)
)
ArrayObject Object
(
[prop] => prop data
[storage:ArrayObject:private] => Array
(
[arr] => array data
)
)