What is PHP Generators ?
As per the php wiki “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.”
so what that means?
In general, generators functions allow you to declare a function that behaves like an iterator by yielding value and saving its state so that when its called again; iteration can continue. This is very helpful to save memory when iterating large data set.
Example:
Lets take a example of simple range iteration:
function my_range($start,$end) { $out = []; for($i=$start; $i<=$end; $i++) { $out[] = $i; } return $out; } foreach( y_range(0,1000) as $j) { //logic here }
In this example, my_range() function will store every output in array, since the array is big we need more memory to store. So if the range set is too high, most probably we will run out of memory.
Lets do same thing with Generators:
function my_range($start,$end) {
for($i=$start; $i<=$end; $i++) {
yield $i;
}
}
foreach( y_range(0,1000) as $j) {
//logic here
}
In above example, each time foreach is run only one value is return, and state (instance) is saved in “yield” so next time it will call next() and continue. This way each time we just need integer memory space each time that will save lots of memory and also results in performance.
Injection:
Apart from getting value we can also pass value to generators
Eample:
function my_range($start,$end) { for($i=$start; $i<=$end; $i++) { $command = (yield $i); if($command =='terminate') return; } } $iterator = y_range(0,1000); foreach($iterator as $j) { //logic here if(//condition) { $iterator->send('terminate');
}
}
send function is use to send command back to generator.
Additional functions:
Since generators implements iterator interface class we can use additional functions:
current ( void ) scalar key ( void ) void next ( void ) void rewind ( void ) boolean valid