生成器不如说是一个生成器函数,关键词是yield,一个生成器可以yield生成许多它所需要的值。
当一个生成器被调用的时候,它返回一个可以被遍历的对象.当你遍历这个对象的时候(例如通过一个foreach循环),PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。
使用
//生成器
function xrange($start, $end, $step)
{
for ($i = $start, $k = 1; $i <= $end; $i += $step, $k++) {
yield $k => $i;
}
}
//输出
foreach (xrange(1, 10, 2) as $key => $value) {
echo "<pre>";
echo "{$key}=>{$value}";
echo "<pre>";
}
输出结果
1=>1
2=>3
3=>5
4=>7
5=>9
是不是很简便。
高级用法
function getYield()
{
yield 1;
yield from [2, 3, 4];//php7 使用
yield from new ArrayIterator([5, 6]); //php7使用
}
foreach (getYield() as $value) {
echo "{$value}" . PHP_EOL;
}
以上输出
1 2 3 4 5 6
修改下官方的菲波那切数列函数
//1 1 2 3 5 8
//一个生成器函数生成给定长度的菲波那切数列 由for或者foreach循环输出
function getFibonacci($len = 3)
{
$i = 0;
$k = 1; //first fibonacci value
yield $k;//第一个 1
//循环
while ($len - 1 > 0) {
$k = $i + $k; //1 2 3 假如有三个数 a b c k等于前两个数相加 k=a+b
$i = $k - $i; //1 1 2 i等于第三个数-第一个数 为第二个数 i=b;
yield $k;
$len--;
}
}
foreach (getFibonacci(10) as $value) {
echo $value.PHP_EOL;
}
结果类似
1 1 2 3 5 8 13 21 34 55