我和一位同事在PHP版本5.5.11中使用新关键字“yield”发现了一个非常奇怪的行为,我们想知道以下是否正常:
给出以下代码:
function yieldTest()
{
echo 'wtf1';
die('wtf2');
foreach (['foo', 'bar', 'baz'] as $each) {
yield $each;
}
}
var_dump(yieldTest());
关于这一点的奇怪之处在于,如果函数中存在“yield”,则:echo和die都被完全跳过而不执行,只有对象“yield”构建是var_dumped。
当我们手动构建数组/对象并使用return时,它按预期工作。
我们发现,一旦函数中存在yield,它甚至会跳过抛出异常。
这是非常奇怪的行为,还是我们发现了一个错误?
我们不能真正相信这是需要的,因为它会大大降低功能的可靠性。
此外,谷歌没有找到任何与此问题有关的信息,为什么我认为我在这里问。
答案 0 :(得分:9)
您的var_dump
只输出生成器对象。在此时执行该功能尚未输入。如果您继续实际使用生成器,则执行函数的代码:
function yieldTest() {
echo 'wtf1';
//throw Exception('test');
foreach (['foo', 'bar', 'baz'] as $each) {
yield $each;
}
}
$test = yieldTest();
foreach ($test as $k) {
var_dump($k);
}
输出
wtf1string(3)“foo”string(3)“bar”string(3)“baz”
如果有人对其进行评论,则会引发异常。