PHP收益,奇怪的行为

时间:2014-05-20 12:41:51

标签: php object yield skip

我和一位同事在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,它甚至会跳过抛出异常。

这是非常奇怪的行为,还是我们发现了一个错误?

我们不能真正相信这是需要的,因为它会大大降低功能的可靠性。

此外,谷歌没有找到任何与此问题有关的信息,为什么我认为我在这里问。

1 个答案:

答案 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”

如果有人对其进行评论,则会引发异常。