Generator::getReturn
(PHP 7)
Generator::getReturn — Get the return value of a generator
Описание
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Returns the generator's return value once it has finished executing.
Примеры
Пример #1 Generator::getReturn() example
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Результат выполнения данного примера:
1 2 3
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник языка
- Встроенные интерфейсы и классы
- Функция Generator::current() - Get the yielded value
- Generator::getReturn
- Функция Generator::key() - Get the yielded key
- Функция Generator::next() - Resume execution of the generator
- Функция Generator::rewind() - Rewind the iterator
- Функция Generator::send() - Send a value to the generator
- Функция Generator::throw() - Throw an exception into the generator
- Функция Generator::valid() - Check if the iterator has been closed
- Функция Generator::__wakeup() - Serialize callback
Коментарии
The note by jm at guide42 dot com is inaccurate. Generator::getReturn() does not check the existence of the return statement, but rather whether the function has returned (finished executing).
<?php
function f(){
yield;
}
f()->getReturn(); // Exception: Cannot get return value of a generator that hasn't returned
$f = f();
$f->next(); // NULL
$f->getReturn(); // NULL, because having no return statement implies an empty `return;`, and the void return value is resolved to null.
I'm not quite sure -- I feel there is an ambiguity issue here with returning a value inside a generator and ->getReturn() method of such generator as I have been able to return an array of sorts, something like this:
function dequeue(){
try{
foreach($this->buffer->data as $data){ ... }
}
return $statistics;
}
foreach(($generator = $this->dequeue()) as $bdata){
.....
}
if($statistics = $generator->getReturn()){
// generator returns $statistics
}
Obviously this is not a complete example, but $statistics does become available with the returned array.
Just to be clear, the value returned by a generator is not yielded while it is running, but is available afterwards through the getReturn() 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 given iterable.)
<?php
function generate_squares($n)
{
$record = [];
for($i = 0; $i <= $n; ++$i)
{
yield ($record[] = $i * $i);
}
return $record;
}
$squares = generate_squares(10);
foreach($squares as $s)
{
echo $s, ' ';
}
$recorded = $squares->getReturn();
echo "\nThat's [", join(', ', $recorded), "]";
?>
Recording keys as well would take a bit more work, as generators are free to repeat them but arrays aren't.