【问题标题】:PHP Yield, strange behaviourPHP Yield,奇怪的行为
【发布时间】:2014-07-08 17:39:23
【问题描述】:

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

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

我们不能相信这是我们想要的,因为它会大大降低函数的可靠性。

Google 也没有提供与此问题相关的任何信息,所以我想我在这里问。

【问题讨论】:

    标签: php object yield skip


    【解决方案1】:

    你的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" 字符串(3) "bar" 字符串(3) "baz"

    如果有人遇到异常,则引发异常。

    【讨论】:

    • 哈哈,这是一个棘手的问题。我们测试了所有东西,但没有测试,该函数正在使用中,这就是为什么它似乎完全不合逻辑,但这仍然很奇怪,它就像一个预处理器,并且可以使函数变得非常不可靠,当你真的不想要它时跳过或执行某些代码。无论如何感谢您的快速和正确的反馈。
    • 记录在案,顺便说一句:php.net/manual/en/…
    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2016-03-19
    • 2013-08-09
    • 2021-11-21
    • 2018-05-20
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多