个别重点自己在此记录下,希望大家还是参考鸟哥博客的那个文章
迭代生成器
(迭代)生成器也是一个函数,不同的是
这个函数的返回值是依次返回
( 迭代生成器其实是生成了一个对象),而不是只返回一个单独的值
.
或者,换句话说,生成器使你能更方便的实现了迭代器接口.下面通过实现一个
xrange
函数来简单说明:
function xrange($start,$end,$step=1){
for ($i=$start; $i<=$end; $i+=$step){
yield $i;
}
}
//xrange(1,10) ;
foreach (xrange(1,10,2) as $key=>$num){
echo $key.'=>'.$num.'<br>';
}
// 打印
0=>1
1=>3
2=>5
3=>7
4=>9
function xrange($start,$end,$step=1){
for ($i=$start; $i<=$end; $i+=$step){
yield $i;
}
}
var_dump(xrange(1,10,2));
// 打印得到 object(Generator)#1 (0) { }
鸟哥原本的例子是
解析:上面这个xrange()
函数提供了和PHP的内建函数range()
一样的功能.但是不同的是range()函数返回的是一个包含值从1到100万0的数组
,而xrange()函数返回的是依次输出这些值的一个迭代器
, 而不会真正以数组形式返回.
这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中
.甚至你可以处理无限大的数据流.
当然,也可以不同通过生成器来实现这个功能,而是可以通过继承Iterator接口实现.但通过使用生成器实现起来会更方便,不用再去实现iterator接口中的5个方法了.
使用数组
function xrange($start,$end,$step=1){
for ($i=$start; $i<=$end; $i+=$step){
echo $i.'<br>';
}
}
xrange(1,10,2);
// 打印
1
3
5
7
9
生成器为可中断的函数
要从生成器认识协程, 理解它内部是如何工作是非常重要的: 生成器是一种可中断的函数, 在它里面的yield构成了中断点.
还是看上面的例子, 调用xrange(1,1000000)的时候, xrange()函数里代码其实并没有真正地运行. 它只是返回了一个迭代器:
<?php
$range = xrange(1, 1000000);
var_dump($range); // object(Generator)#1
var_dump($range instanceof Iterator); // bool(true)
?>
这也解释了为什么xrange叫做迭代生成器, 因为它返回一个迭代器, 而这个迭代器实现了Iterator接口.