Генераторы — это специальные функции в PHP, которые позволяют итерировать по набору данных без необходимости создания всего массива в памяти. Они генерируют значения "на лету", что делает их исключительно полезными для работы с большими наборами данных или бесконечными последовательностями.
<?php
function generateNumbers($limit) {
for ($i = 1; $i <= $limit; $i++) {
// yield возвращает значение и приостанавливает функцию
yield $i;
}
}
foreach (generateNumbers(1000000) as $number) {
echo $number . "\n";
}
В этом примере не создается массив из миллиона чисел — каждое число генерируется по требованию.
Экономия памяти:
Бесконечные последовательности:
<?php
function infiniteSequence() {
$i = 0;
while (true) {
yield $i++;
}
}
<?php
function keyValueGenerator() {
yield 'a' => 1;
yield 'b' => 2;
}
Характеристика | Обычная функция | Генератор |
---|---|---|
Возврат значения | return | yield |
Состояние | Теряется после вызова | Сохраняется между вызовами |
Память | Хранит все данные | Хранит только текущее значение |
Возвращаемый тип | Любой | \Generator |
<?php
function generatorA() {
yield 1;
yield 2;
}
function generatorB() {
yield from generatorA(); // Делегирование
yield 3;
}
<?php
function receivingGenerator() {
$received = yield; // Получаем значение
yield "Получено: $received";
}
$gen = receivingGenerator();
$gen->send('Hello!'); // Отправляем значение
echo $gen->current(); // Выведет "Получено: Hello!"
<?php
function readLargeFile($fileName) {
$file = fopen($fileName, 'r');
while (!feof($file)) {
yield fgets($file);
}
fclose($file);
}
foreach (readLargeFile('huge_log.txt') as $line) {
// Обработка каждой строки
}