PHP Conference Japan 2024

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

添加注释

用户贡献的注释 3条注释

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
6年前
需要明确的是,生成器返回的值在运行时不会被yield,而是在之后通过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
7年前
我不太确定——我觉得这里在生成器内部返回值和此类生成器的->getReturn()方法之间存在歧义问题,因为我已经能够返回某种数组,如下所示

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

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

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

显然这不是一个完整的例子,但是$statistics确实可以通过返回的数组获得。
To Top