Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 7 из 20II. Язык как инструмент120 минут

Глава 7. Массивы и SPL по форме операции

PHP array удобен, но не нейтрален: правильная структура начинается с требуемых операций и ограничений, а не с привычного синтаксиса.

После главы вы сможете
  • различать list и map
  • выбирать очередь или heap
  • не терять форму массива

Один синтаксис скрывает разные модели

Последовательный список событий, карта счётчиков по типу и множество уже встреченных id могут быть представлены array, но требуют разных инвариантов. Удаление элемента списка оставляет разрыв ключей; JSON после этого способен превратить коллекцию в object. array_values восстанавливает список только когда такое изменение осмысленно.

Pulse называет переменные eventsList, countsByType и seenIds, а проверки формы выполняет на boundary. Смешанная коллекция с частью числовых и частью строковых ключей не проходит дальше.

Выбор операции

От операции к структуреСтруктура выбирается по главной операции и требуемому порядку, а затем измеряется на реальном объёме.Append/readlistLookup keymapMembershipsetFIFOqueuePriorityheap
Структура выбирается по главной операции и требуемому порядку, а затем измеряется на реальном объёме.

Set поверх map

Для проверки повторного event id удобно хранить ключи со значением true. in_array выполняет линейный поиск и требует строгого режима, тогда как isset по ключу обычно выражает membership быстрее. Если допустимо значение null, array_key_exists отвечает на другой вопрос.

Ключ из внешнего ввода нормализуется и ограничивается до помещения в карту. Иначе атакующий создаст огромный набор произвольных ключей и превратит защиту от дублей в источник расхода памяти.

SPL как более точный словарь

SplQueue выражает FIFO без array_shift, который перемещает элементы. SplPriorityQueue подходит при выборе следующего события по приоритету, но его поведение при одинаковых приоритетах нужно определить отдельно. SplFixedArray экономит часть накладных расходов только при известном размере и не является автоматическим ускорением.

SPL-структуры имеют собственные правила итерации, клонирования и сериализации. Перед заменой array напишите тест операции и измерьте данные Pulse; точное имя не оправдывает сложность само по себе.

Итераторы вместо промежуточных массивов

FilterIterator и LimitIterator могут выражать ленивую обработку, но цепочка классов должна оставаться читаемой. Генератор часто проще для предметного преобразования. Выбор оценивается по прозрачности остановки, обработке ошибки и способности повторить итерацию.

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

Лаборатория

Реализуйте окно последних 100 событий через SplQueue, множество id через map и очередь трёх наиболее критичных типов через SplPriorityQueue. Опишите поведение одинакового приоритета.

  • List перед JSON имеет последовательные ключи.
  • Membership использует ключи, а не нестрогий in_array.
  • Память множества имеет верхнюю границу.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Почему array_shift плох для большой FIFO-очереди?
2. Чем isset отличается от array_key_exists?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/book.spl.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/language.types.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie