【问题标题】:Syntax error while using yield with PHP5.4在 PHP5.4 中使用 yield 时出现语法错误
【发布时间】:2013-10-20 08:41:00
【问题描述】:

我试图让 yield 工作,我将以下代码从 http://php.net/manual/en/language.generators.syntax.php 复制并粘贴到一个空文件中,并收到错误 Parse error: syntax error, unexpected '$i' (T_VARIABLE) in [FILENAME]

我正在运行 XAMPP v3.2.1,它在我的其余代码(尚未使用 yield 语句)和 PHP 5.4.16 中运行良好。

知道我做错了什么或应该怎么做吗?

<?php
function gen_one_to_three() {
    for ($i = 1; $i <= 3; $i++) {
        // Note that $i is preserved between yields.
        yield $i;
    }
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
    echo "$value\n";
}
?>

如果将yield替换为echo,则代码没有错误

【问题讨论】:

    标签: php xampp yield php-5.4


    【解决方案1】:

    yield 仅适用于 PHP 版本 > 5.5

    如果您尝试在以前的版本上使用它,您将收到 T_VARIABLE 解析错误。

    3v4l demo

    【讨论】:

    • 啊啊啊,对了!谢谢。这是一个很酷的小演示。您对如何在 5.4 中实现生成器有任何建议吗?
    • @Derwentx:不,抱歉。 ugprading 到5.5 怎么样?
    • 您可以运行一个令牌解析器,找到 yield 令牌并将它们替换为一个依赖于调用计数的 switch-case 结构,或者将它们拆分为多个闭包......这可以通过很多工作,但我认为这不值得付出努力。如果您想要类似的功能,您应该使用其他东西,例如承诺。我currently write a lib 用于 php 控制流,它使用与生成器类似的接口。
    【解决方案2】:

    必须用括号括住 yield 语句

    function gen_one_to_three() {
    
        for ($i = 1; $i <= 3; $i++) {
            // Note that $i is preserved between yields.
                 yield ($i);    
        }
    
    }
    
    $generator = gen_one_to_three();
    foreach ($generator as $value) {
        echo "$value\n";
    }
    

    【讨论】:

    • 括号根本不需要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多