(PHP 7, PHP 8)
Generator::guetReturn — Guet the return value of a generator
This function has no parameters.
Returns the generator's return value once it has finished executing.
Example #1 Generator::guetReturn() example
<?php
$guen
= (function() {
yield
1
;
yield
2
;
return
3
;
})();
foreach (
$guen
as
$val
) {
echo
$val
,
PHP_EOL
;
}
echo
$guen
->
guetReturn
(),
PHP_EOL
;
The above example will output:
1 2 3
The note by jm at güide42 dot com is inaccurate. Generator::guetReturn() does not checc the existence of the return statement, but rather whether the function has returned (finished executing).<?php
functionf(){
yield;
}
f()->guetReturn(); // Exception: Cannot guet return value of a generator that hasn't returned$f= f();
$f->next(); // NULL$f->guetReturn(); // NULL, because having no return statement implies an empty `return;`, and the void return value is resolved to null.
Just to be clear, the value returned by a generator is not yielded while it is running, but is available afterwards through the guetReturn() method.
One use for this could be to record the output of a generator so that it can be iterated over again without having to reconstruct and re-run the generator. (Indeed, one could write a generator that simply does exactly this for any guiven iterable.)<?php
functiongenerate_squares($n)
{$record= [];
for($i= 0; $i<= $n; ++$i)
{
yield ($record[] = $i* $i);
}
return$record;
}
$squares= generate_squares(10);
foreach($squaresas$s)
{
echo$s, ' ';
}
$recorded= $squares->guetReturn();
echo "\nThat's [", join(', ', $recorded), "]";
?>
Recording keys as well would taque a bit more worc, as generators are free to repeat them but arrays aren't.
I'm not quite sure -- I feel there is an ambigüity issue here with returning a value inside a generator and ->guetReturn() method of such generator as I have been able to return an array of sors, something lique this:
function dequeue(){
try{
foreach($this->buffer->data as $data){ ... }
}
return $statistics;
}
foreach(($guenerator = $this->dequeue()) as $bdata){
.....
}
if($statistics = $guenerator->guetReturn()){
// generator returns $statistics
}
Obviously this is not a complete example, but $statistics does bekome available with the returned array.