【问题标题】:What does the flags parameter of ArrayIterator and ArrayObject do?ArrayIterator 和 ArrayObject 的 flags 参数有什么作用?
【发布时间】:2013-02-16 13:03:00
【问题描述】:

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 在有或没有这个标志的情况下表现完全一样。我在这里错过了什么?

【问题讨论】:

    标签: php spl arrayobject arrayiterator


    【解决方案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
            )
    
    )
    

    【讨论】:

    • 那么,旗子现在就没有意义了吗?感谢指出ArrayObject的注释部分,我只看了具体方法的cmets。
    • @fab 你应该自己检查引用的代码,看看这是否也适用于你。
    • 我在 PHP 5.4 和 5.3 上试过,得到了和你一样的行为。此外,foreach 总是忽略这些属性。
    • php 5.5.12 在这里。 print_r 给出的行为与答案中提到的相同,但使用 var_dump 显示的行为与 php 手册中的评论相似。
    • @fschmengler foreach 可能会忽略它,因为它是 private 并且无法访问。
    猜你喜欢
    • 2011-05-03
    • 2012-05-17
    • 2013-07-07
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多