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

