PHP中的Generator是什么-创新互联
这篇文章主要介绍了PHP中的Generator是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。
为宜川等地区用户提供了全套网页设计制作服务,及宜川网站建设行业解决方案。主营业务为成都做网站、成都网站制作、宜川网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!何为 Generator
从 PHP 5.5 开始,PHP 加入了一个新的特性,那就是Generator
,中文译为生成器
。生成器可以简单地用来实现对象的迭代,让我们先从官方的一个小例子说起。
xrange
在 PHP 中,我们都知道,有一个函数叫做range
,用来生成一个等差数列的数组,然后我们可以用这个数组进行foreach
的迭代。具体就想这样。
foreach (range(1, 100, 2) as $num) { echo $num . PHP_EOL; }
这一段代码就会输出首项为 1,末项为 100,公差为 2 的等差数列。它的执行顺序是这样的。首先,range(1, 100, 2)
会生成一个数组,里面存了上面那样的一个等差数列,之后在foreach
中对这个数组进行迭代。
那么,这样就会出现一个问题,如果我要生成 100 万个数字呢?那我们就要占用上百兆内存。虽然现在内存很便宜,但是我们也不能这么浪费内存嘛。那么这时,我们的生成器就可以排上用场了。考虑下面的代码。
function xrange($start, $limit, $step = 1) { while ($start <= $limit) { yield $start; $start += $step; } } foreach (xrange(1, 100, 2) as $num) { echo $num . PHP_EOL; }
这段代码所的出来的结果,和前面的那段代码一模一样,但是,它内部的原理是天翻地覆了。
我们刚才说了,前面的代码,range
会生成一个数组,然后foreach
来迭代这个数组,从而取出某一个值。但是这段代码呢,我们重新定义了一个xrange
函数,在函数中,我们用了一个关键字yield
。我们都知道定义一个函数,希望它返回一个值得时候,用return
来返回。那么这个yield
呢,也可以返回一个值,但是,它和return
是截然不同的。
使用yield
关键字,可以让函数在运行的时候,中断,同时会保存整个函数的上下文,返回一个Generator
类型的对象。在执行对象的next
方法时,会重新加载中断时的上下文,继续运行,直到出现下一个yield
为止,如果后面没有再出现yield
,那么就认为整个生成器结束了。
这样,我们上面的函数调用可以等价地写成这样。
$nums = xrange(1, 100, 2); while ($nums->valid()) { echo $nums->current() . "\n"; $nums->next(); }
在这里,$num
是一个Generator
的对象。我们在这里看到三个方法,valid
、current
和next
。当我们函数执行完了,后面没有yield
中断了,那么我们在xrange
函数就执行完了,那么valid
方法就会变成false
。而current
呢,会返回当前yield
后面的值,这是,生成器的函数会中断。那么在调用next
方法之后,函数会继续执行,直到下一个yield
出现,或者函数结束。
好了,到这里,我们看到了通过yield
来“生成”一个值并返回。其实,yield
其实也可以这么写$ret = yield;
。同返回值一样,这里是将一个值在继续执行函数的时候,传值进函数,可以通过Generator::send($value)
来使用。例如。
function sum() { $ret = yield; echo $ret . PHP_EOL; } $sum = sum(); $sum->send('I am from outside.');
这样,程序就会打印出send
方法传进去的字符串了。在yield
的两边可以同时有调用。
function xrange($start, $limit, $step = 1) { while ($start <= $limit) { $ret = yield $start; $start += $step; echo $ret . PHP_EOL; } } $nums = xrange(1, 100, 2); while ($nums->valid()) { echo $nums->current() . "\n"; $nums->send($nums->current() + 1); }
而像这样的使用,send()
可以返回下一个yield
的返回。
其它的 Generator 方法
Generator::key()
对于yield
,我们可以这样使用yield $id => $value
,这是,我们可以通过key
方法来获取$id
,而current
方法返回的是$value
。
Generator::rewind()
这个方法,可以帮我们让生成器重新开始执行并保存上下文,同时呢,会返回第一个yield
返回的内容。在第一次执行send
方法的时候,rewind
会被隐式调用。
Generator::throw()
这个方法,向生成器中,抛送一个异常。
后记
yield
作为 PHP 5.5 的新特性,让我们用了新的方法来高效地迭代数据。同时,我们还可以使用yield
来实现协程。
以上就是PHP中的Generator是什么的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎来创新互联网站建设公司,行业资讯!
网页名称:PHP中的Generator是什么-创新互联
浏览地址:http://myzitong.com/article/pipdd.html