Symfony обеспечивает OrderedHashMap
, это состояние документации
В отличие от ассоциативных массивов, карта отслеживает порядок, в котором ключи были добавлены и удалены. Этот порядок отражается во время итерации.
Я смущен этим утверждением, потому что я думал, что ассоциативные массивы PHP на самом деле уже упорядоченные карты. Я нашел этот вопрос на SO, который подтверждает мое предыдущее предположение: Упорядочены ли PHP-ассоциативные массивы?
Интересно, если разработчики Symfony не знали, что PHP-массивы — это уже упорядоченные карты, или я не понимаю роль Symfony? OrderedHashMap
Конечно, массив PHP — это упорядоченная карта.
Но Симфония OrderedHashMap
имеет несколько другое поведение (скажем, функции) из массива PHP.
OrderedHashMap
поддерживает одновременное изменение во время итерации. Это означает, что вы можете вставлять и удалять элементы из foreach
цикл и итератор будет отражать эти изменения соответственно. Но array
в итерации копируется (Копирование при записи), любая модификация не отражается в цикле.
$map = new OrderedHashMap();
$map[1] = 1;
$map[2] = 2;
$map[3] = 3;
foreach ($map as $index => $value) {
echo "$index: $value\n"if (1 === $index) {
$map[1] = 4;
$map[] = 5;
}
}
Вы получите другой результат, если вы используете array
, В итерации array
цикл не увидит число 5
,
Около «Зачем?«: Поиск в Кодовая база Symfony. Есть только один место для использования OrderedHashMap
, который используется для хранения дочерних форм. Используется new InheritDataAwareIterator($this->children)
повторять. Поэтому я думаю, что ответ — помочь обработать детей формы.
И благодаря @fishbone:
Таким образом, выгода заключается не в упорядочении, а в возможности его изменения в циклах.
В общем, не только в контексте Symfony, помимо дополнительных реализованных функций, объектно-ориентированные структуры предпочтительнее, чем примитивные типы, такие как int
, string
или же array
как они могут быть введены в класс для модульного тестирования.
Объектно-ориентированные структуры могут также применять инварианты, тогда как примитивные типы могут хранить данные только без каких-либо действий.