Spl, ArrayObject, ArrayObject:: STD_PROP_LIST

Я пытаюсь понять константу STD_PROP_LIST в документации, но до сих пор я этого не понимал и не нашел никаких объяснений:( Документация имеет следующий пример:

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

Оба отпечатка дают мне точный результат:

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

Кто-нибудь может помочь мне понять, в чем разница между использованием этой константы или нет?

Спасибо заранее!

Ответы

Ответ 1

ArrayObject и ArrayIterator - это 2 класса, которые действительно похожи. На самом деле они оба совместно используют часть кода внутри ядра php. Эти два класса имеют внутренний массив для хранения элементов, которые вы установили для этих классов.

STD_PROP_LIST сообщает нам, как читать, а ARRAY_AS_PROPS сообщает нам, как мы должны писать эти элементы. Прежде всего, установка элементов через стандартную запись ([]) всегда будет работать одинаково, независимо от этих настроек.

При установке флагов ARRAY_AS_PROPS это означает, что когда вы устанавливаете свойства (через ->), не будет установлено на объект, как вы ожидали бы с обычными объектами, но будет сохранен как внутренние элементы. Если этот флаг НЕ установлен, он сохранит свойство на фактическом массиве-объекте или массиве-итераторе, что вы видите в коде, выводимом из вашего примера: "prop => propdata" не находится внутри storage:ArrayObject:private, который бы имел место, если бы был установлен флаг ARRAY_AS_PROPS:

$a = new ArrayObject();
$a['arr'] = 'array data';
$a->prop = 'prop data';

$b = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$b['arr'] = 'array data';
$b->prop = 'prop data';

print_r($a);
print_r($b);

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

STD_PROP_LIST решает, что нужно возвращать при определенных условиях, особенно в var_dump(). Хотя будут и другие случаи, я сам их не нашел. Если параметр STD_PROP_LIST установлен, он вернет свойства, которые были установлены в ваш класс ArrayObject или ArrayIterator. Если он НЕ установлен, то var_dump() вернет список внутренних элементов, которые были сохранены.

Фактическая документация не соответствует 100% на STD_PROP_LIST. Этот флаг влияет на var_dump(), но не foreach(). При использовании foreach() он всегда будет перебирать внутренние элементы и никогда не будет действительными свойствами, даже если STD_PROP_LIST был установлен.

Эти два флага не являются взаимоисключающими: вы можете установить оба флажка, но это не имеет особого смысла: это означает, что свойства всегда добавляются как внутренние элементы (ARRAY_AS_PROPS), и мы хотим вернуть стандартных свойств через var_dump (STD_PROP_LIST). Поскольку свойства не могут быть установлены, он всегда будет возвращать пустой список в этом случае.