**基本语法**
生成器函数与普通函数类似,但使用`yield`关键字返回值:
php
function generatorFunction() {
yield value1;
yield value2;
// 可以有更多yield语句
}
// 使用foreach迭代生成器
foreach (generatorFunction() as $value) {
echo $value;
}
**核心特性**
1. **惰性求值**
生成器不会立即计算所有值,而是在每次迭代时才生成下一个值。
2. **状态保存**
生成器在两次迭代之间会保存内部状态,下次调用时从上次暂停的位置继续执行。
3. **节省内存**
无需预先创建完整数组,适合处理海量数据或无限序列。
**示例1:生成斐波那契数列**
php
function fibonacciGenerator($max) {
$a = 0;
$b = 1;
while ($a <= $max) {
yield $a;
$temp = $a;
$a = $b;
$b = $temp + $b;
}
}
// 使用生成器输出斐波那契数列
foreach (fibonacciGenerator(100) as $num) {
echo $num . " "; // 输出: 0 1 1 2 3 5 8 13 21 34 55 89
}
**示例2:读取大文件**
处理大文件时,传统方法可能导致内存溢出,而生成器可以逐行读取:
php
function readLines($filePath) {
$file = fopen($filePath, 'r');
if (!$file) return;
while (($line = fgets($file)) !== false) {
yield $line;
}
fclose($file);
}
// 逐行处理大文件
foreach (readLines('large_file.txt') as $line) {
// 处理每一行数据
echo $line;
}
**带键的生成器**
`yield`支持指定键值对:
php
function keyValueGenerator() {
yield 'key1' => 'value1';
yield 'key2' => 'value2';
}
foreach (keyValueGenerator() as $key => $value) {
echo "$key: $value\n";
}
**生成器的返回值**
PHP 7+ 支持生成器使用`return`返回最终值(需通过`Generator::getReturn()`获取):
php
function countToThree() {
yield 1;
yield 2;
return 3;
}
$generator = countToThree();
foreach ($generator as $value) {
echo $value; // 输出: 1 2
}
echo $generator->getReturn(); // 输出: 3
**应用场景**
- **大数据集处理**:如数据库查询结果、大文件解析。
- **无限序列**:如时间戳生成、随机数流。
- **优化内存**:替代传统数组,减少内存占用。
**注意事项**
- 生成器只能遍历一次,如需多次使用需重新创建。
- 生成器返回的是`Generator`对象,实现了`Iterator`接口。
通过`yield`,PHP 提供了一种高效、简洁的方式处理迭代逻辑,尤其适合资源敏感的场景。