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;`,而 void 返回值會解析為 null。
Hayley Watson
6 年前
需要說明的是,生成器返回的值在運行時並不會被 yield 出來,而是在之後透過 getReturn() 方法取得。

這種用法的一個例子是記錄生成器的輸出,以便之後可以再次迭代,而無需重新建構和重新運行生成器。(事實上,可以編寫一個生成器,它完全針對任何給定的可迭代物件執行此操作。)

<?php
函數 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
"\n結果是 [", join(', ', $recorded), "]";
?>

同時記錄鍵值需要更多工作,因為生成器可以重複鍵值,但陣列不行。
brandon at cryy dot com
7 年前
我不太確定 -- 我覺得在生成器內返回值以及使用此類生成器的 ->getReturn() 方法會產生歧義,因為我已經能夠返回某種陣列,像這樣

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

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

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

顯然這不是一個完整的範例,但 $statistics 確實可以透過返回的陣列取得。
To Top