php 7.1 中生成器 return 值需调用 getreturn() 显式获取,且仅在生成器终止后有效;未遍历完即调用会抛出 runtimeexception。

PHP 7.1 中生成器函数支持在 yield 流程结束后用 return 返回终值,但这个返回值不会出现在 foreach 迭代中,必须显式调用 getReturn() 获取,否则会被静默丢弃。
确认生成器已完全消费再取 return 值
第一步:确保生成器对象已被完整遍历,否则 getReturn() 会抛出 RuntimeException。
第二步:调用 $gen->getReturn() 获取 return 表达式的值,该调用必须在生成器状态为“已终止”后执行。
第三步:若不确定是否已消费完毕,可用 $gen->valid() 检查——返回 false 才代表可安全调用 getReturn()。
这一步不能跳过:未消费完就调用 getReturn() 会触发 【RuntimeException: Cannot get return value of a generator that hasn't finished】,且无法捕获为普通异常(需 try/catch GeneratorException 或 RuntimeException)。
正确写法示例:return 后接表达式
方法一:直接 return 字面量或变量
function genWithSummary(): Generator { yield 'a'; yield 'b'; return 'processed 2 items'; }
方法二:return 表达式计算结果(支持函数调用、三元、算术等)
function genCount($limit): Generator { for ($i = 1; $i 5 ? 'large' : 'small'); }
注意:return 后的表达式在生成器终止时才求值,所以可含副作用操作(如日志记录),但不建议在此处做耗时 I/O。
错误写法与修复
错误写法:在 yield 之后写 return $value 并期望它参与迭代
function badGen() { yield 1; return 999; } // foreach 输出只有 1,999 被忽略且无法自动获取
修复方式:改用 getReturn() 显式提取
$g = badGen(); foreach ($g as $v) echo "$v "; echo $g->getReturn(); // 输出:1 999
关键点:【return 表达式不是 yield 数据流的一部分,而是独立的终值容器】,混用 yield 和 return 时,二者职责必须分明。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











