前言
这是年后第一次更新技术文章,就和大家说说 生成器(Generator)。请注意,大约是 PHP5.5之后的版本,才支持中该语法。
聊点闲话
PHP 这个语言很有趣,很少有先发制人的新特性,很多语法思想都来自其他语言。这并不是吐槽,反而是一种表扬,因为PHP一直在积极改进,不会抱守陈规进入衰老期。
生成器解决了什么问题
先思考这样一个需求:我们创建一个数组,值是 连续的数字,然后用 foreach 来遍历它。需求很简单,实操很麻烦,因为这个数组太大了,将占用超级多的内存。
简单来说就是:
那么,问题来了
如何降低对内存的占用呢?
生成器专门解决此问题
使用生成器语法(yield)能够在需要的时候去产生值,而非提前创建所有值(这句话很重要)
例子
生成器语法
如何定义生成器
只要一个函数中,出现了 那么它就是生成器函数。
上面的代码将输出 表示返回值是一个 生成器对象。
yield 有什么用?
和 return 一样,可以返回结果,但必须通过 foreach 才能调用。
yield 和 return 有什么区别?
函数执行到 return 之后,会立刻停止执行,并返回结果。再次调用函数,会重新执行整个函数。
函数执行到 yield 之后,会立刻暂停执行,并返回结果。再次调用函数,将从暂停处继续执行。
注意:是重点。
如何演示 暂停 这个效果?
函数 a() 是生成器,内部有一个 0-100 的循环。
foreach 每循环一次,yield 都会完成一次 ,并返回当前的结果。
生成器好像也没什么用?
绝大多数情况下,我们不需要生成器(毕竟以前没有生成器语法,程序也执行的不错)
但是,它解决的是大问题
它不一定非得用在普通数字上,只要是大量数据,就可以分批分次,按序载入,来降低对内存的占用。
总结
程序员中有这样一批人,从不关注基础知识,但是给他足够的时间和一台联网的电脑,他能够把程序鼓捣出来。
解决问题的能力很强,这是优点,但也是缺点。太多基础知识没学过,所以对于很多解决方案不甚了解,只能用更初级的方法去解决问题。
领取专属 10元无门槛券
私享最新 技术干货