Ответ
Генераторы (Generator) в PHP — это специальные функции, которые позволяют итерироваться по набору данных, не загружая весь набор в память сразу. Они выдают значения по одному по мере необходимости, используя ключевое слово yield.
Основная польза — экономия памяти при работе с большими данными.
Пример: Обработка большого файла Без генератора пришлось бы читать весь файл в массив:
function readAllLines(string $file): array {
$lines = [];
$handle = fopen($file, 'r');
while (($line = fgets($handle)) !== false) {
$lines[] = trim($line); // Все строки хранятся в памяти!
}
fclose($handle);
return $lines; // Массив может быть огромным
}
С генератором — строки обрабатываются по одной:
function readLinesGenerator(string $file): Generator {
$handle = fopen($file, 'r');
while (($line = fgets($handle)) !== false) {
yield trim($line); // Возвращает одну строку и приостанавливается
}
fclose($handle);
}
// Использование
foreach (readLinesGenerator('huge_log.txt') as $line) {
// Обрабатываем строку $line. В памяти всегда только одна строка.
if (str_contains($line, 'ERROR')) {
echo $line . PHP_EOL;
}
}
Ключевые преимущества генераторов:
- Ленивые вычисления (lazy evaluation): Значения генерируются только когда в них возникает потребность в цикле.
- Экономия памяти: Не требуется хранить весь результат в массиве.
- Работа с бесконечными последовательностями: Можно генерировать числа Фибоначчи или поток данных без риска исчерпать память.
- Упрощение кода итераторов: Заменяет необходимость реализации полноценного интерфейса
Iterator.