Ответ 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
). Поскольку свойства не могут быть установлены, он всегда будет возвращать пустой список в этом случае.