yield 实现php
yield 在 PHP 中的实现
yield 是 PHP 中用于生成器(Generator)的关键字,允许在函数中暂停执行并返回一个值,后续可以从暂停的位置继续执行。生成器提供了一种高效的方式来处理大量数据或延迟计算,避免一次性加载所有数据到内存。
基本语法
生成器函数使用 yield 关键字返回值,而不是 return。调用生成器函数时,会返回一个 Generator 对象,可以通过迭代器接口(如 foreach)逐步获取值。

function generatorExample() {
yield 'value1';
yield 'value2';
yield 'value3';
}
$generator = generatorExample();
foreach ($generator as $value) {
echo $value . PHP_EOL;
}
键值对生成
yield 不仅可以返回值,还可以返回键值对,类似于关联数组。
function keyValueGenerator() {
yield 'key1' => 'value1';
yield 'key2' => 'value2';
}
$generator = keyValueGenerator();
foreach ($generator as $key => $value) {
echo "$key: $value" . PHP_EOL;
}
生成器委托
PHP 7.0 引入了 yield from 语法,允许生成器委托给另一个生成器或可迭代对象。

function delegateGenerator() {
yield 1;
yield from [2, 3];
yield from anotherGenerator();
}
function anotherGenerator() {
yield 4;
}
$generator = delegateGenerator();
foreach ($generator as $value) {
echo $value . PHP_EOL;
}
生成器与内存效率
生成器特别适合处理大量数据,因为它们不会一次性将所有数据加载到内存中,而是按需生成。
function largeDatasetGenerator($start, $end) {
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}
$generator = largeDatasetGenerator(1, 1000000);
foreach ($generator as $number) {
echo $number . PHP_EOL;
}
生成器与协程
生成器可以用于实现简单的协程(Coroutine),通过双向通信(send() 方法)在生成器和调用者之间传递数据。
function coroutineExample() {
$input = yield;
echo "Received: $input" . PHP_EOL;
$input = yield;
echo "Received: $input" . PHP_EOL;
}
$generator = coroutineExample();
$generator->send('Hello');
$generator->send('World');
注意事项
- 生成器函数不能包含
return语句返回值(但可以用于终止生成器)。 - 生成器是一次性的,遍历完成后无法再次使用。
- 生成器对象实现了
Iterator接口,可以直接用于foreach循环。






