В чем разница между генератором и обычным циклом в PHP?

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

Ответ

Основное отличие — в управлении памятью и потоке выполнения.

Обычный цикл (например, foreach) обрабатывает всю коллекцию данных сразу, загружая все элементы в память. Это может быть проблематично при работе с большими наборами данных.

// Цикл: весь массив создается в памяти
$numbers = range(0, 1000000);
foreach ($numbers as $number) {
    echo $number . "n";
}

Генератор — это функция, которая использует ключевое слово yield. Она возвращает значения по одному по мере необходимости, не создавая всю коллекцию в памяти. Состояние функции сохраняется между вызовами.

// Генератор: значения генерируются "на лету"
function generateNumbers(int $limit): Generator {
    for ($i = 0; $i < $limit; $i++) {
        yield $i;
    }
}

foreach (generateNumbers(1000000) as $number) {
    echo $number . "n";
}

Ключевые различия:

  • Память: Генератор экономит память, так как не хранит всю коллекцию.
  • Ленивые вычисления: Генератор вычисляет следующее значение только когда оно запрошено.
  • Состояние: Генератор можно приостановить (yield) и возобновить, что полезно для работы с потоками данных или бесконечными последовательностями.
  • Производительность: Для небольших коллекций цикл может быть быстрее. Генератор выигрывает при обработке больших или потенциально бесконечных данных.