PHP的产量抑制函数

时间:2018-10-25 17:38:03

标签: php yield php-7.1

我使用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

知道为什么会这样吗?

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

1 个答案:

答案 0 :(得分:0)

第一次调用时,会产生key 1元素,并且不会回显任何内容:

new Date(serialNumber * 24 * 60 * 60 * 1000 + new Date(1899, 11, 30).getTime())

在第二次调用(第二次迭代)中,生成器在“暂停”的位置继续,这意味着它将在string(33) "key1 text" 之后的下一个表达式(yield)继续,并在此时{ {1}}仍然是“ key1”,这意味着它输出:

echo

到达$key循环的结尾,missing key1 跳到下一个元素,现在为“ key2”,并产生第二个值:$ trans [“ key2”]和{{1 }}显示:

foreach

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

$key

对生成器的第四次调用仍将var_dump()

string(27) "key2 text"

但是,到达missing key2 string(29) "key3 text" 的末尾时,不再产生任何值,生成器达到了最后一个值。