Ответ вслух Senior Функции, замыкания, генераторы обновлено

Генераторы в реальных задачах

Вопрос

Где вы применяли генераторы в PHP и какие у них ограничения?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Самый частый сценарий: обработка данных, которые не помещаются в память. Например, импорт CSV на несколько гигабайт: функция-генератор читает файл через fgets и отдаёт строки по одной, а потребление памяти остаётся постоянным.

Что должно прозвучать в ответе

  • Потоковая обработка больших файлов и выборок без загрузки в память

  • Ленивая выдача элементов: код выполняется по мере перебора

  • Конвейеры: фильтр и преобразование как цепочка генераторов

  • 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 ошибок.