视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP生成器-动态生成内容的数组
2020-11-03 18:18:07 责编:小采
文档
定义:

1.生成器:“动态生成内容的数组”,用到值的时候才去生产。

2.搭配使用:关键字 yield foreach

推荐:《php培训》

过程:

1.作为生成器的方法相当于定义了一个数组;

2.生成器中的 yield,每次出现相当于定义了一个数组中出现的值;

3.foreach 会遍历生成器中所有的 yield 定义的值(某个被定义的值(表达式),只有在被用到的时候,当前yield同上一个yield之间的其他表达式才会被执行,当前yield之后的表达式不会被执行);

4.foreach 正常结束的话(不是break),判断一下生成器中最后一个yield之后是否有其他表达式未执行完,是的话,执行之;

5.不同于线程,不是并行执行,只是在主业务逻辑和生成器之间来回切换执行,只节省了空间,时间没省下来。

设想使用场景:

1、取大数据文件,生成器中逐行读取;

2、???

例子:

gen.php

 <?php
 function gen()
 {
 echo '生成器开始执行' . PHP_EOL;
 for ($i = 0; $i < 5; $i++) {
 echo '产生数据之前:' . $i . PHP_EOL;
 yield $i; 
 echo '产生数据之后:' . $i . PHP_EOL;
 } 
 echo '再来一个数据' . PHP_EOL;
 yield 5;
 echo '生成器执行结束' . PHP_EOL;
 } 
 $gen_func = gen();
 echo '生成器开始执行了吗?' . PHP_EOL;
 foreach ($gen_func as $key => $val) {
 echo '使用数据前' . PHP_EOL;
 echo '使用数据:' . $val . PHP_EOL;
 echo '使用数据后' . PHP_EOL;
 //if ($key >= 4) {
 //break;
 //} 
 }

执行结果:

php gen.php
生成器开始执行了吗?
生成器开始执行
产生数据之前:0
使用数据前
使用数据:0
使用数据后
产生数据之后:0
产生数据之前:1
使用数据前
使用数据:1
使用数据后
产生数据之后:1
产生数据之前:2
使用数据前
使用数据:2
使用数据后
产生数据之后:2
产生数据之前:3
使用数据前
使用数据:3
使用数据后
产生数据之后:3
产生数据之前:4
使用数据前
使用数据:4
使用数据后
产生数据之后:4
再来一个数据
使用数据前
使用数据:5
使用数据后
生成器执行结束

部分执行过程解读:

1、14行并没有调用生成器gen(),只是做了定义;

2、进入 foreach 循环后,开始调用gen();

3、$val 需要值的时候,记住当前位置a,执行生成器;

4、执行到 yield 定义的地方,取到值了,记住当前位置b,返回位置a;

5、循环3、4两步;

6、循环结束,执行完 yield 最后一次定义的地方的之后的剩下部分;

7、去掉20、21、22行的注释后执行,"使用数据:4 使用数据后",就不再有其他输出。

其他(仅验证了PHP7.1.14版本)

1、value);//YES value;//NO

2、可以使用yield val;

3、PHP7之后,yield from 可以调用生成器、数组、使用return等。

更多编程相关内容,请关注Gxlcms编程教程栏目!

下载本文
显示全文
专题