PHP5.5迭代生成器用法实例详解
发布:smiling 来源: PHP粉丝网 添加日期:2021-07-14 21:29:33 浏览: 评论:0
这篇文章主要介绍了PHP5.5迭代生成器用法,结合实例形式详细分析了PHP5.5迭代生成器的功能,定义及相关使用技巧,需要的朋友可以参考下。
本文实例讲述了PHP5.5迭代生成器用法,分享给大家供大家参考,具体如下:
PHP5.5引入了迭代生成器的概念,迭代的概念早就在PHP有了,但是迭代生成器是PHP的一个新特性,这跟python3中的迭代生成器类似,看看PHP5.5的迭代生成器如何定义。
- <?php
- function xrange($start, $end, $step = 1) {
- for ($i = $start; $i <= $end; $i += $step) {
- yield $i;
- }
- }
- foreach (xrange(1, 1000000) as $num) {
- echo $num, "\n";
- }
注意关键字:yield,正是这个yeild关键字构建了一个迭代器,这个函数xrange跟以往的函数的不同之处就在这里。一般情况都是return一个值,而yield一个值就表示这是个迭代器,每循环一次这个迭代器就生成这个值,故名为迭代生成器,迭代生成器这个函数可以进行foreach循环,每次都产生一个值。
PHP5.5之前是通过定义类实现Iterator接口的方式来构造迭代器,通过yield构造迭代器将更加提升性能节省系统开销。
这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。
如上面例子所示,这个迭代器的功能是生成从1到1000000的数字,循环输出,那么使用以往的方式是生成好这1到1000000的数字到数组中,将会十分占用内存,因为是事先就要生成好所有结果,而不是用的时候按需生成,也就是说调用xrange这个迭代器的时候,里面的函数还没有真正的运行,直到你每一次的迭代。
再看看PHP官网的例子:
- <?php
- function xrange($start, $limit, $step = 1) {
- for ($i = $start; $i <= $limit; $i += $step) {
- yield $i;
- }
- }
- echo 'Single digit odd numbers: ';
- /*
- * Note that an array is never created or returned,
- * which saves memory.
- */
- foreach (xrange(1, 9, 2) as $number) {
- echo "$number ";
- }
- echo "\n";
- ?>
这里的xrange是一个迭代,功能和range是一样的,如果使用range函数的话,那么函数内部实现会储存每个迭代的中间过程,即每个中间变量都有 个内存空间,那么首先程序使用的内存空间就大了,而且分配内存,回收内存都会导致程序的运行时间加长。但是如果使用上yield实现的xrange函数的 话,里面所有的中间变量都只使用一个内存$i,这样节省的时间和空间都会变小。
那么为什么yield会有这样的效果呢?联想到lua中的yield,这里就算是协程的概念了。在lua语言中,当程序运行到yield的时候,使用协程 将上下文环境记录住,然后将程序操作权归还到主函数,当主函数调用resume的时候,会重新唤起协程,读取yield记录的上下文。这样形成了程序语言 级别的多协程操作,php 5.5这里的yield也是同样的道理,当程序运行到yield的时候,当前程序就唤起协程记录上下文,然后主函数继续操作,只是php中没有使用如 resume一样的关键字,而是“在使用的时候唤起”协程。比如上例中的foreach迭代器就能唤起yield。所以上面的这个例子就能理解了。
Tags: PHP5 5迭代生成器
相关文章
- ·用实例分析PHP5异常处理(2013-11-13)
- ·php5的simplexml解析错误(2013-11-13)
- ·php5.3中php-fpm进程管理方式(2014-06-20)
- ·php-screw在php5.4.6中编译失败问题(2014-06-29)
- ·PHP5中哈希创建和验证方法详解(2014-08-22)
- ·PHP5.2.X防止Hash冲突拒绝服务攻击的Patch方法(2014-08-23)
- ·php5.3下使用php管理crontab计划任务(2014-08-27)
- ·解决php5.3不能连接mssql数据库问题(2014-09-10)
- ·php-fpm参数优化让你的php-fpm(php5.3+)网站跑得更快(2015-09-24)
- ·MAC通过MacPorts配置 PHP54+PHP FPM+NGINX+MYSQL5.5(2015-12-10)
- ·PHP5.5迭代生成器用法实例详解(2019-11-17)
- ·PHP5中实现多态的两种方法实例分享(2020-11-19)
- ·php5.4以下版本json不支持不转义内容中文的解决方法(2021-05-08)
- ·PHP5.2中PDO的简单使用方法(2021-07-21)
- ·php5.5使用PHPMailer-5.2发送邮件的完整步骤(2021-10-31)
- ·php5.x禁用eval的操作方法(2021-10-31)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)