首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP里的生成器

前言

这是年后第一次更新技术文章,就和大家说说 生成器(Generator)。请注意,大约是 PHP5.5之后的版本,才支持中该语法。

聊点闲话

PHP 这个语言很有趣,很少有先发制人的新特性,很多语法思想都来自其他语言。这并不是吐槽,反而是一种表扬,因为PHP一直在积极改进,不会抱守陈规进入衰老期。

生成器解决了什么问题

先思考这样一个需求:我们创建一个数组,值是 连续的数字,然后用 foreach 来遍历它。需求很简单,实操很麻烦,因为这个数组太大了,将占用超级多的内存。

简单来说就是:

那么,问题来了

如何降低对内存的占用呢?

生成器专门解决此问题

使用生成器语法(yield)能够在需要的时候去产生值,而非提前创建所有值(这句话很重要)

例子

生成器语法

如何定义生成器

只要一个函数中,出现了 那么它就是生成器函数。

上面的代码将输出 表示返回值是一个 生成器对象。

yield 有什么用?

和 return 一样,可以返回结果,但必须通过 foreach 才能调用。

yield 和 return 有什么区别?

函数执行到 return 之后,会立刻停止执行,并返回结果。再次调用函数,会重新执行整个函数。

函数执行到 yield 之后,会立刻暂停执行,并返回结果。再次调用函数,将从暂停处继续执行。

注意:是重点。

如何演示 暂停 这个效果?

函数 a() 是生成器,内部有一个 0-100 的循环。

foreach 每循环一次,yield 都会完成一次 ,并返回当前的结果。

生成器好像也没什么用?

绝大多数情况下,我们不需要生成器(毕竟以前没有生成器语法,程序也执行的不错)

但是,它解决的是大问题

它不一定非得用在普通数字上,只要是大量数据,就可以分批分次,按序载入,来降低对内存的占用。

总结

程序员中有这样一批人,从不关注基础知识,但是给他足够的时间和一台联网的电脑,他能够把程序鼓捣出来。

解决问题的能力很强,这是优点,但也是缺点。太多基础知识没学过,所以对于很多解决方案不甚了解,只能用更初级的方法去解决问题。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226B08IY000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券