Итератор

Оригинальное название: iterator

Коротко

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

Что такое «Итератор»

Цикл foreach в PHP или for…of в JavaScript выглядит одинаково для массива, строк файла и результатов запроса к базе. Это возможно благодаря итераторам: каждая коллекция умеет выдать объект с простым договором «дай следующий элемент» и «есть ли ещё». Цикл общается только с этим договором, а не с внутренним устройством данных. Такой приём описан как один из классических паттернов проектирования.

Важное следствие — ленивость. Итератор не обязан держать все элементы в памяти: он может читать следующую строку файла или следующую страницу из API только тогда, когда её попросили. Так можно обработать выгрузку на миллион товаров, не загружая её целиком.

Итератор в PHP

Объект становится перебираемым, если реализует интерфейс Iterator с методами current(), key(), next(), rewind() и valid(). Чаще проще реализовать IteratorAggregate и вернуть готовый итератор:

class Cart implements IteratorAggregate
{
    private array $items = ['A-100' => 2, 'B-200' => 1];

    public function getIterator(): Iterator
    {
        return new ArrayIterator($this->items);
    }
}

foreach (new Cart() as $sku => $qty) { echo "$sku: $qty\n"; }

Ещё короче — генератор: функция с yield автоматически возвращает итератор. В стандартной библиотеке SPL есть готовые итераторы для каталогов, файлов и ограничения выборки.

Протокол итерации в JavaScript

Здесь договор такой: у итератора есть метод next(), который возвращает объект { value, done }. Перебираемые объекты — массивы, строки, Map, Set — отдают итератор через метод Symbol.iterator. Им пользуются for…of, оператор расширения ... и деструктуризация.

Чем отличается от итерации

Итератор — объект-механизм, а итерация — сам процесс повторения или один его шаг. Итератор обеспечивает итерации по коллекции. Типичная ошибка — менять коллекцию во время обхода: удалённый или добавленный элемент сбивает позицию, и часть данных пропускается или обрабатывается дважды. Вторая — пытаться пройти один итератор дважды: многие итераторы, в том числе генераторы, одноразовые.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение