Генераторы в реальных задачах
Вопрос
Где вы применяли генераторы в PHP и какие у них ограничения?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Потоковая обработка больших файлов и выборок без загрузки в память
Ленивая выдача элементов: код выполняется по мере перебора
Конвейеры: фильтр и преобразование как цепочка генераторов
yield from для рекурсии и композиции
Ограничения: одноразовые, нет count и случайного доступа, нельзя перемотать
Курсоры в ORM: Laravel lazy и cursor, Doctrine toIterable
Что могут спросить следом
- Как посчитать количество элементов генератора, не загружая их в память?
- Чем Laravel cursor отличается от chunk?
Разбор
Самый частый сценарий: обработка данных, которые не помещаются в память. Например, импорт CSV на несколько гигабайт: функция-генератор читает файл через fgets и отдаёт строки по одной, а потребление памяти остаётся постоянным. То же с выборками из базы: в Laravel cursor() и lazy(), в Doctrine toIterable() построены на генераторах.
Генераторы удобно складывать в конвейер: filter(map(readLines($file))), где каждый этап ленивый, и данные проходят цепочку по одному элементу. yield from помогает обходить деревья рекурсивно и собирать генераторы из других.
Ограничения: генератор одноразовый, его нельзя перемотать и перебрать второй раз; у него нет count() и доступа по индексу; исключение внутри прерывает перебор. Если данные нужны несколько раз, я либо пересоздаю генератор, либо материализую результат через iterator_to_array, если он помещается в память.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.