Что делает параметр flags ArrayIterator и ArrayObject?

Конструкторы PHP ArrayIterator и ArrayObject имеют параметр 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_dump и foreach ведут себя одинаково с этим флагом или без него. Что мне здесь не хватает?


person Fabian Schmengler    schedule 16.02.2013    source источник


Ответы (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, так как моя версия (5.4.6) PHP всегда показывает как: Свойства, так и значения массива:

ArrayObject Object
(
    [prop] => prop data
    [storage:ArrayObject:private] => Array
        (
            [arr] => array data
        )

)
ArrayObject Object
(
    [prop] => prop data
    [storage:ArrayObject:private] => Array
        (
            [arr] => array data
        )

)
person TimWolla    schedule 16.02.2013
comment
Значит, флаг уже не имеет смысла? Спасибо за указание на раздел комментариев ArrayObject, я просмотрел комментарии только к конкретным методам. - person Fabian Schmengler; 16.02.2013
comment
@fab Вы должны сами проверить приведенный код, чтобы узнать, относится ли это и к вам. - person TimWolla; 16.02.2013
comment
Я попробовал это на PHP 5.4 и 5.3, получил такое же поведение, как и вы. Кроме того, foreach всегда игнорирует свойства. - person Fabian Schmengler; 16.02.2013
comment
php 5.5.12 здесь. print_r дает такое же поведение, как указано в ответе, но использование var_dump показывает поведение, аналогичное комментарию из руководства по php. - person Mridul Aggarwal; 15.06.2014
comment
@fschmengler foreach, вероятно, игнорирует его, потому что он private и недоступен. - person kaiser; 03.10.2014
comment
Я не говорил о частной собственности. - person Fabian Schmengler; 06.10.2014