Generator syntax

A generator function looks just like a normal function, except that instead
of returning a value, a generator yields as many values as it needs to.

When a generator function is called, it returns an object that can be
iterated over. When you iterate over that object (for instance, via a
foreach loop), PHP will call the generator function each time it needs a
value, then saves the state of the generator when the generator yields a
value so that it can be resumed when the next value is required.

Once there are no more values to be yielded, then the generator function
can simply exit, and the calling code continues just as if an array has run
out of values.

Note:

A generator cannot return a value: doing so will result in a compile
error. An empty return statement is valid syntax within
a generator and it will terminate the generator.

yield keyword

The heart of a generator function is the yield keyword.
In its simplest form, a yield statement looks much like a return
statement, except that instead of stopping execution of the function and
returning, yield instead provides a value to the code looping over the
generator and pauses execution of the generator function.

Yielding by reference

Generator functions are able to yield values by reference as well as by
value. This is done in the same way as
returning references from functions:
by prepending an ampersand to the function name.

Example #4 Yielding values by reference

<?phpfunction &gen_reference() {$value = 3;

while ($value > 0) {yield $value; }}

/* * Note that we can change $number within the loop, and * because the generator is yielding references, $value * within gen_reference() changes. */foreach (gen_reference() as &$number) { echo (--$number).'... ';}?>

When a generator function is called for the first time, an object of the
internal Generator class is returned. This object
implements the Iterator interface in much the same
way as a forward-only iterator object would.