【问题标题】:PHP yield supresses echoing in functionPHP yield 抑制函数中的回显
【发布时间】:2019-03-30 09:54:02
【问题描述】:

我使用 PHP 7.1.15。 使用以下功能,我尝试输出缺少条目或让生成器稍后生成

public function myFunc($doc)
{
    $trans = $this->getTranslations($doc);
    foreach ($this->keys as $key) {
        if (array_key_exists($key, $trans)) {
            yield $trans[$key];
        }
        echo "missing ".$key."<br>";

    }
}

但在我的情况下,我没有得到回声 - 当我循环通过生成器时,回声是它的一部分。

    foreach($translation as $trans){
        var_dump($trans);
    }

输出如下所示

string(33) "key1 text" 
missing key1
string(27) "key2 text"
missing key2
string(29) "key3 text" 
missing key3

知道为什么会这样吗?

编辑:我知道,收益不像回报。这是关于回声行为 - 因此我创建了输出示例。

【问题讨论】:

  • 你的回声不应该在else 部分吗?现在您将收到数组中每个键的 missing key 消息
  • "在其最简单的形式中,yield 语句看起来很像 return 语句,只是它不是停止函数的执行并返回,而是为在生成器上循环的代码提供一个值,并且 暂停生成器函数的执行”
  • 如果您希望它仅在密钥不存在时回显,那么您需要一个else 条件。
  • 查看编辑部分...回声应该在生成器的输出之前不与它混合...问题更多是关于:为什么生成器中有回声,并且只会循环生成器时输出

标签: php yield php-7.1


【解决方案1】:

第一次调用时,key 1 元素被产生,没有任何回显:

string(33) "key1 text"

在第二次调用(第二次迭代)中,生成器继续“暂停”的位置,这意味着它继续 yield 之后的下一个表达式,即 echo,此时,$key 仍然存在“key1”,这意味着它输出:

missing key1

到达foreach 循环的末尾,$key 跳转到下一个元素,现在是“key2”,并产生第二个值:$trans["key2"] 和var_dump() 显示:

string(27) "key2 text"

在下一次迭代中,输出将是:

missing key2
string(29) "key3 text"

第 4 次调用生成器仍将是 echo:

missing key3

但是,到达$this-&gt;keys 的末尾,不再产生任何值,生成器达到了它的最后一个值。

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2016-06-09
    • 2012-04-29
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多