2

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

ArrayObject::STD_PROP_LIST

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

ArrayObject::ARRAY_AS_PROPS

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

ArrayIterator::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行为都完全相同。我在这里想念什么?

4

1 回答 1

1

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

?>

这种行为可能会在 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
        )

)
于 2013-02-16T13:12:22.897 回答