Yield 关键字

yield 语句类似于 return 语句,除了不是停止执行函数并返回,而是返回一个 Generator 对象并暂停执行生成器函数。

以下是作为生成器编写的范围函数的示例:

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

你可以看到这个函数通过检查 var_dump 的输出返回一个 Generator 对象:

var_dump(gen_one_to_three())

# Outputs:
class Generator (0) {
}

产生价值

发电机对象随后可以像阵列遍历。

foreach (gen_one_to_three() as $value) {
    echo "$value\n";
}

以上示例将输出:

1
2
3

用键产生值

除了产生值之外,你还可以产生键/值对。

function gen_one_to_three() {
    $keys = ["first", "second", "third"];

    for ($i = 1; $i <= 3; $i++) {
        // Note that $i is preserved between yields.
        yield $keys[$i - 1] => $i;
    }
}

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

以上示例将输出:

first: 1
second: 2
third: 3