Генератор — функция с yield, которая возвращает значения по одному, не загружая всё в память.
function readLargeFile(string $file): \Generator {
$handle = fopen($file, 'r');
while (!feof($handle)) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readLargeFile('10gb.log') as $line) {
process($line);
}Без генератора file() загрузил бы весь файл в массив → OutOfMemoryError.
Генератор реализует интерфейс Iterator. Ключевые отличия от обычной функции:
• Выполнение приостанавливается на yield
• Возобновляется при следующем обращении к итератору
• yield from позволяет делегировать другому генератору
Применение: обработка больших файлов, пагинация из DB, потоковая генерация данных.