Перейти к основному содержимому

Генераторы в PHP и yield

Генераторы предоставляют простой способ реализации итераторов без накладных расходов и сложности создания класса, реализующего интерфейс Iterator.

Что такое генератор?​

Функция-генератор выглядит точно так же, как обычная функция, за исключением того, что вместо возврата значения генератор отдаёт (yield) столько значений, сколько необходимо. Любая функция, содержащая yield, является функцией-генератором.

При вызове функции-генератора она возвращает объект, по которому можно итерировать. Когда вы итерируете по этому объекту (например, через цикл foreach), PHP вызывает методы итерации объекта каждый раз, когда требуется следующее значение, а затем сохраняет состояние генератора при отдаче значения, чтобы можно было возобновить работу, когда потребуется следующее значение.

Преимущества​

Главное преимущество — эффективное использование памяти. Вы можете итерировать по большому набору данных, не создавая массив в памяти.

Базовый пример​

function get_numbers() {
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}

foreach (get_numbers() as $number) {
echo $number; // 123
}

yield from​

Делегирование генератора позволяет отдавать значения из другого генератора, объекта Traversable или массива с помощью ключевого слова yield from.

function count_to_ten() {
yield 1;
yield 2;
yield from [3, 4];
yield from count_rest();
}

function count_rest() {
yield 5;
// ...
}