Генераторы в 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;
// ...
}