PHP中生成器是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生。但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP发送才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。
优点
直接讲概念估计你听完还是一头雾水,所以我们先来说说优点,也许能勾起你的兴趣。那么生成器有哪些优点,如下:
- <李>生成器会对PHP应用的性能有非常大的影响李> <>李PHP代码运行时节省大量的内存李> <>李比较适合计算大量的数据李>
那么,这些神奇的功能究竟是如何做到的?我们先来举个例子。
概念引入
首先,放下生成器概念的包袱,来看一个简单的PHP函数:
函数createRange(美元){ $ data=https://www.yisu.com/zixun/[]; (我=0;美元我<数量;美元+ +){ $ data []=(); } 返回元数据; }复制代码
这是一个非常常见的PHP函数,我们在处理一些数组的时候经常会使用。这里的代码也非常简单:
- <李>我们创建一个函数。李> <>李函数内包含一个<代码> 代码>循环,我们循环的把当前时间放到<代码> $ data> 代码里面李> <李> <代码> 代码>循环执行完毕,把<代码> $ data> 代码返回出去。李>
下面没完,我们继续。我们再写一个函数,把这个函数的返回值循环打印出来:
$结果=createRange (10);//这里调用上面我们创建的函数 foreach(结果美元值){ 睡眠(1);//这里停顿1秒,我们后续有用 echo $价值标准# 39;& lt; br/祝辞& # 39;; }复制代码
我们在浏览器里面看一下运行结果:
! [] (https://picb.zhimg.com/80/v2 - 3620 f3d46bb5b49e53ca47891ea1fd5a_720w.jpg)
这里非常完美,没有任何问题。(当然睡眠(1)<代码> 代码>效果你们看不出来)
思考一个问题
我们注意到,在调用函数<代码> createRange> 代码的时候给<代码> 代码>数量美元的传值是10,一个很小的数字。假设,现在传递一个值<代码> 10000000 代码>(1000年万)。
那么,在函数<代码> createRange> 代码里面,<代码> 代码>循环就需要执行<代码> 代码>万1000次。且有<代码> 1000 代码>万个值被放到<代码> $ data> 代码里面,而<代码> $ data> 代码数组在是被放在内存内,所以,在调用函数时候会占用大量内存。
这里,生成器就可以大显身手了。
创建生成器
我们直接修改代码,你们注意观察:
函数createRange(美元){ (i=0; i<美元;数美元,美元我+ +){ 产量(); } }复制代码
看下这段和刚刚很像的代码,我们删除了数组<代码> $ data> 代码,而且也没有返回任何内容,而是在()<代码>时间> 代码之前使用了一个关键字<代码>产量代码>
使用生成器
我们再运行一下第二段代码:
$结果=createRange (10);//这里调用上面我们创建的函数 foreach(结果美元值){ 睡眠(1); echo $价值标准# 39;& lt; br/祝辞& # 39;; }复制代码
! [] (https://pic2.zhimg.com/80/v2-9c08f2d01f7a68736f45ffa3d3934cc5_720w.jpg)
我们奇迹般的发现了,输出的值和第一次没有使用生成器的不一样。这里的值(时间戳)中间间隔了1秒。
这里的间隔一秒其实就是睡眠(1)<代码> 代码>造成的后果。但是为什么第一次没有间隔?那是因为:
- <李>未使用生成器时:<代码> createRange 代码>函数内的<代码> 代码>循环结果被很快放到<代码> 代码>中元数据,并且立即返回,所以,<代码> foreach 代码>循环的是一个固定的数组。李> <李>使用生成器时:<代码> createRange> 代码的值不是一次性快速生成,而是依赖于<代码> foreach 代码>循环。<代码> foreach 代码>循环一次,<代码> 代码>执行一次。李>
到这里,你应该对生成器有点儿头绪。
深入理解生成器
代码剖析
下面我们来对于刚刚的代码进行剖析。
函数createRange(美元){ (i=0; i<美元;数美元,美元我+ +){ 产量(); } } 结果=美元createRange (10);//这里调用上面我们创建的函数 foreach(结果美元值){ 睡眠(1); echo $价值标准# 39;& lt; br/祝辞& # 39;; }复制代码PHP中生成器是什么