【问题标题】:Why does php return an empty Generator if function contains both return and yield?如果函数同时包含return和yield,为什么php会返回一个空的Generator?
【发布时间】:2020-06-21 19:00:24
【问题描述】:
// Returns empty generator as expected.
function yieldOnly(): Generator
{
yield;
}
// Throws TypeError as expected.
function returnOnly(): Generator
{
return;
}
// Returns empty generator???
function returnAndYield(): Generator
{
return;
yield;
}
returnAndYield() 的返回值是一个空的Generator,虽然我期待它会抛出一个TypeError。这是预期的行为吗?我在任何地方都找不到它的文档,我想知道这是否可能是一个应该报告的错误。
【问题讨论】:
标签:
php
generator
typeerror
yield
type-hinting
【解决方案1】:
关于generator syntax 的手册说如下:
任何包含yield 的函数都是生成器函数。
因此,通过在其中包含 yield 关键字会产生生成器函数。使用return 关键字,您将退出该函数,该函数用于构建生成器函数。在这种情况下,它只是空的,因为在 return 语句之前没有 yield 行。当您使用以下源代码时:
function returnAndYield(): Generator
{
yield 1;
yield 2;
return;
yield 3;
yield 4;
}
$result = returnAndYield();
echo implode(',', iterator_to_array($result));
你会得到以下输出:
1,2
值 3 和 4 不在生成器中,因为函数在这些 yield 语句之前退出。