ArrayTerator和ArrayObject的flags参数的作用是什么


What does the flags parameter of ArrayIterator and ArrayObject do?

PHP的ArrayIteratorArrayObject的构造函数有一个flags参数,该参数在ArrayObject::setFlags()中记录如下:

ArrayObject::STD_PROP_LIST

对象的属性在作为列表(var_dump、foreach等)访问时具有正常功能

ArrayObject::ARRAY_AS_PROPS

条目可以作为属性(读和写)进行访问。

ArrayTerator::setFlags()的文档是相似的(差异是错误的)。

现在,我很好地理解了第二个标志,它允许使用->访问属性,也可以使用[]:访问数组

$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_dumpforeach的行为都完全相同。我在这里错过了什么?

正如PHP手册中的注释所述,该标志使属性而不是数组值在var_dump中可见。

这归功于PHP手册中的注释:

<?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);                                             
?>

这种行为可能在never版本的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
        )
)