如果函数同时包含return和yield,为什么php会返回一个空的Generator?

Leo*_*los 3 php yield generator typeerror type-hinting

// 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;
}
Run Code Online (Sandbox Code Playgroud)

的返回值returnAndYield()是一个空的Generator,尽管我期望它抛出一个TypeError。这是预期的行为吗?我在任何地方都找不到它的记录,我想知道这是否可能是一个应该报告的错误。

Pro*_*man 5

关于生成器语法的手册如下:

任何包含的函数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));
Run Code Online (Sandbox Code Playgroud)

你将得到以下输出:

function returnAndYield(): Generator
{
    yield 1;
    yield 2;
    return;
    yield 3;
    yield 4;
}

$result = returnAndYield();
echo implode(',', iterator_to_array($result));
Run Code Online (Sandbox Code Playgroud)

34不在生成器中,因为函数在这些yield语句之前退出。