Ответ
Основное отличие — в управлении памятью и потоке выполнения.
Обычный цикл (например, 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) и возобновить, что полезно для работы с потоками данных или бесконечными последовательностями. - Производительность: Для небольших коллекций цикл может быть быстрее. Генератор выигрывает при обработке больших или потенциально бесконечных данных.