Чем может быть полезен генератор в PHP?

«Чем может быть полезен генератор в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Генераторы (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.