ArrayIterator和ArrayObject的flags参数有什么作用?

时间:2013-02-16 13:03:00

标签: php spl arrayobject arrayiterator

PHP的ArrayIteratorArrayObject的构造函数有一个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_dumpforeach在有或没有此标志的情况下表现完全相同。我在这里缺少什么?

1 个答案:

答案 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
        )

)