Почему Symfony предоставляет OrderedHashMap

Symfony обеспечивает OrderedHashMap, это состояние документации

В отличие от ассоциативных массивов, карта отслеживает порядок, в котором ключи были добавлены и удалены. Этот порядок отражается во время итерации.

Я смущен этим утверждением, потому что я думал, что ассоциативные массивы PHP на самом деле уже упорядоченные карты. Я нашел этот вопрос на SO, который подтверждает мое предыдущее предположение: Упорядочены ли PHP-ассоциативные массивы?

Интересно, если разработчики Symfony не знали, что PHP-массивы — это уже упорядоченные карты, или я не понимаю роль Symfony? OrderedHashMap

2

Решение

Конечно, массив 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:

Таким образом, выгода заключается не в упорядочении, а в возможности его изменения в циклах.

2

Другие решения

В общем, не только в контексте Symfony, помимо дополнительных реализованных функций, объектно-ориентированные структуры предпочтительнее, чем примитивные типы, такие как int, string или же array как они могут быть введены в класс для модульного тестирования.

Объектно-ориентированные структуры могут также применять инварианты, тогда как примитивные типы могут хранить данные только без каких-либо действий.

0

По вопросам рекламы [email protected]