Генераторы PHP — ленивое получение значений через yield
Генератор создаёт Traversable-последовательность и приостанавливает функцию на yield, не собирая весь результат в массив.
function rows(iterable $source): GeneratorМинимальный пример
<?php
function numbers(int $last): Generator {
for ($i = 1; $i <= $last; $i++) {
yield $i;
}
}Память
Преимущество появляется, когда источник тоже читается порциями, а потребитель не складывает всё обратно в массив. iterator_to_array() отменяет ленивость результата.
Ключи и значения
yield принимает ключ через `yield $key => $value`. Повторяющиеся ключи разрешены во время итерации, но потеряются при преобразовании в обычный массив.
Очистка ресурсов
Файл или курсор закрывайте через try/finally внутри генератора. Потребитель может остановить итерацию раньше, поэтому путь досрочного завершения важен.
Когда не нужен
Для десятка значений массив проще. Генератор полезен для потенциально больших потоков и композиции итераторов, а не как декоративная замена foreach.
Связанные материалы
Источники и проверка
- PHP Documentation Group — структурный источник, без внешней ссылки
Последняя содержательная проверка: . Автор-разработчик Михаил Каржин. Методика качества контента.