Я пытаюсь понять константу 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 ) )
Кто-нибудь может помочь мне понять, в чем разница между использованием этой константы или нет?
Заранее спасибо!
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
). Поскольку свойства не могут быть установлены, он всегда будет возвращать пустой список в этом случае.