Generator::getReturn

(PHP 7, PHP 8)

Generator::getReturn获取生成器的返回值

描述

public Generator::getReturn(): mixed

参数

此函数没有参数。

返回值

返回生成器完成执行后的返回值。

示例

示例 #1 Generator::getReturn() 示例

<?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

添加注释

用户贡献的注释 4 条注释

pemapmodder1970 at gmail dot com
7 年前
jm at guide42 dot com 的注释不准确。Generator::getReturn() 不会检查 return 语句是否存在,而是检查函数是否已返回(完成执行)。

<?php
function f(){
yield;
}

f()->getReturn(); // 异常:无法获取尚未返回的生成器的返回值

$f = f();
$f->next(); // NULL
$f->getReturn(); // NULL,因为没有 return 语句意味着为空的 `return;`,空返回值解析为 null。
Hayley Watson
5 年前
为了清楚起见,生成器返回的值不会在运行时产生,而是在之后通过 getReturn() 方法获得。

这样做的一个用途可能是记录生成器的输出,以便无需重建和重新运行生成器即可对其进行迭代。(实际上,可以编写一个生成器,它只是对任何可迭代对象执行此操作。)

<?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), "]";
?>

记录键将需要更多工作,因为生成器可以重复键,但数组不行。
brandon at cryy dot com
6 年前
我不太确定——我觉得在生成器内部返回值和 ->getReturn() 方法之间存在歧义问题,因为我能够返回某种数组,类似于这样

function dequeue(){
try{
foreach($this->buffer->data as $data){ ... }
}
return $statistics;
}

foreach(($generator = $this->dequeue()) as $bdata){
.....
}

if($statistics = $generator->getReturn()){
// 生成器返回 $statistics
}

显然这不是一个完整的示例,但 $statistics 确实随返回的数组一起可用。
jm at guide42 dot com
8 年前
注意,如果生成器中没有 return,则 `->getReturn()` 将抛出异常

<?php
function g() {
yield
'A';
}
try {
g()->getReturn();
} catch (
Exception $ex) {
var_dump($ex->getMessage());
// 无法获取尚未返回的生成器的返回值
}
?>
To Top