资讯专栏INFORMATION COLUMN

PHP生成器--动态生成内容的数组

klinson / 336人阅读

摘要:定义生成器动态生成内容的数组,用到值的时候才去生产。其他仅验证了版本可以使用之后,可以调用生成器数组使用等。传送门手册里都有

定义:

生成器:“动态生成内容的数组”,用到值的时候才去生产。
搭配使用:关键字 yield foreach

过程:

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

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

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

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

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

设想使用场景:

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

例子:
  gen.php
  1  $val) {
 17     echo "使用数据前" . PHP_EOL;
 18     echo "使用数据:" . $val . PHP_EOL;
 19     echo "使用数据后" . PHP_EOL;
 20     //if ($key >= 4) {
 21         //break;
 22     //} 
 23 }
执行结果:
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、$data = (yield $value);//YES $data = yield $value;//NO
2、可以使用yield $key => $val;
3、PHP7之后,yield from 可以调用生成器、数组、使用return等。
(传送门:PHP手册里都有)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28755.html

相关文章

  • PHP内存模型

    摘要:为单进程的由代执行每一个请求由从进程池中取出进程初始化数据结构创建进程变量共享类似于的内容为所有进程所共享即单例模式默认是采用磁盘文件实现的管理即变量是一次请求说单独的享有的不能被所有请求所共享共享由于每次请求代由创建进程所以由共享问题是使 php为单进程的,由apache代执行,每一个请求,由apache从进程池中取出进程,初始化数据结构,创建进程. 变量共享,类似于session的...

    Maxiye 评论0 收藏0
  • (PHP7内核剖析-8) 类

    摘要:父类方法为错误,成员方法不得被重写。父子类方法静态属性不一致父类方法为非静态而子类的是静态或相反,错误。 1.类的结构 类是编译阶段的产物,而对象是运行时产生的,它们归属于不同阶段。编译完成后我们定义的每个类都会生成一个zend_class_entry,它保存着类的全部信息,在执行阶段所有类相关的操作都是用的这个结构, struct _zend_class_entry { ch...

    JohnLui 评论0 收藏0
  • ajax概述

    摘要:换一台电脑就要重新安装。并且还需要适配不同的系统。提交大小几乎没有限制。即协议主要由请求和响应组成。相反则为同步按照程序的顺序,依次往下执行,必须等上一程序执行完成之后才能执行下一程序,阻碍程序的执行。 Ajax 服务器 类型 按照服务类型:文件服务器,数据库服务器,邮件服务器,Web服务器 按照操作系统:Linux服务器,Windows服务器 按照应用软件:Apache服务器,Ng...

    Achilles 评论0 收藏0
  • 基于 Swoole 构建 CTF AWD 比赛环境搭建与实践

    摘要:出题思路本次题目来自于我的一个外包项目实践。回合制比赛以分钟为一回合。选手在比赛过程中需要盗取到对手的密钥,以窃听他方内容,并修改己方密钥以放泄露动态该部分同样由中心服务器与完成。 Author: RytiaDate: 20190427Blog: www.zzfly.net本人才学疏浅,望君不吝赐教 背景 受学校老师邀请,为学弟学妹举办分享会介绍 AWD 相关经验,本人一时头脑风暴采用...

    GitCafe 评论0 收藏0
  • php底层原理之变量(一)

    摘要:对于来说,变量有全局变量和局部变量之分那么,他们都是存储到一个哈希表内了么其实不是的,变量存储也有作用域的概念。 上次跟大家讲了垃圾回收机制后,有些小伙伴对底层原理比较感兴趣,私信问我了一些关于变量的相关知识,既然大家对变量比较感兴趣,那么这次我们来系统的讲一下变量的底层原理 变量结构 首先,我们还是先摆上我们的zval结构体,即php所有变量都会以zval结构体的形式实现 struc...

    curlyCheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<