位置: 编程技术 - 正文

深入解析PHP中foreach语句控制数组循环的用法(php fork)

编辑:rootadmin

推荐整理分享深入解析PHP中foreach语句控制数组循环的用法(php fork),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php中foreach的用法,php中foreach的用法,php for in,php fork,php for in,php的foreach,php fork,php for in,内容如对您有帮助,希望把文章链接给更多的朋友!

foreach是PHP中很常用的一个用作数组循环的控制语句。因为它的方便和易用,自然也就在后端隐藏着很复杂的具体实现方式(对用户透明)今天,我们就来一起分析分析,foreach是如何实现数组(对象)的遍历的。我们知道PHP是一个脚本语言,也就是说,用户编写的PHP代码最终都是会被PHP解释器解释执行,特别的,对于PHP来说,所有的用户编写的PHP代码,都会被翻译成PHP的虚拟机ZE的虚拟指令(OPCODES)来执行,不论细节的话,就是说,我们所编写的任何PHP脚本,都会最终被翻译成一条条的指令,从而根据指令,由相应的C编写的函数来执行。

那么foreach会被翻译成什么样子呢?

在词法分析阶段,foreach会被识别为一个TOKEN:T_FOREACH,在语法分析阶段,会被规则:

仔细分析这段语法规则,我们可以发现,对于:

会被分析为:

然后,让我们来看看foreach_statement:它其实就是一个代码块,体现了我们的 echo $key . ‘=>' . $val .”n”;T_ECHO expr;

显然,实现foreach的核心就是如下3个函数:

zend_do_foreach_begin zend_do_foreach_cont zend_do_foreach_end

其中,zend_do_foreach_begin (代码太长,直接写伪码) 主要做了:1. 记录当前的opline行数(为以后跳转而记录)2. 对数组进行RESET(讲内部指针指向第一个元素)3. 获取临时变量 ($val)4. 设置获取变量的OPCODE FE_FETCH,结果存第3步的临时变量4. 记录获取变量的OPCODES的行数

而对于 zend_do_foreach_cont来说:1. 根据foreach_variable的u.EA.type来判断是否引用2. 根据是否引用来调整zend_do_foreach_begin中生成的FE_FETCH方式3. 根据zend_do_foreach_begin中记录的取变量的OPCODES的行数,来初始化循环(主要处理在循环内部的循环:do_begin_loop)

深入解析PHP中foreach语句控制数组循环的用法(php fork)

最后zend_do_foreach_end:1. 根据zend_do_foreach_begin中记录的行数信息,设置ZEND_JMP OPCODES2. 根据当前行数,设置循环体下一条opline, 用以跳出循环3. 结束循环(处理循环内循环:do_end_loop)4. 清理临时变量

当然, 在zend_do_foreach_cont 和 zend_do_foreach_end之间 会在语法分析阶段被填充foreach_satement的语句代码。

这样,就实现了foreach的OPCODES line。比如对于我们开头的实例代码,最终生成的OPCODES是:

我们注意到FE_FETCH的op2的操作数是,也就是JMP后一条opline,也就是说,在获取完最后一个数组元素以后,FE_FETCH失败的情况下,会跳到第行opline,从而实现了循环的结束。而行opline的op1的操作数是指向了FE_FETCH,也就是无条件跳转到第5行opline,从而实现了循环。

附录:

同时还要注意的是,foreach在使用中是值还是传引用的问题。php 中遍历一个array时可以使用for或foreach,foreach的语法为:foreach ($arr as $k => $v)。遍历数组,把index赋给$k,数组的值赋给$v,那么此处的赋值是传值还是传引用呢。先看下面的例子:

观察可以发现在foreach循环中对$arr操作并没有影响到$arr的元素,所以这里的赋值是传值而不是传引用。那如果需要修改$arr中元素的值该怎么办呢?可以在变量前面加一个”&”符号,例如:

再看另外一个例子,array里面存放的是object,

此时可以看到原始数组中的object对象已经修改了,所以这里的赋值又是传引用而不是传值

综合上述,得出的结论:如果数组里面存放的是普通类型的元素就是采用传值的方式,存放对象类型元素采用的方式为传地址。

使用Huagepage和PGO来提升PHP7的执行性能 HugepagePHP7刚刚发布了RC4,包含一些bug修复和一个我们最新的性能提升成果,那就是HugePageFyPHPTEXTsegment,通过启用这个特性,PHP7会把自身的TEXT段(执行体

PHP接收json 并将接收数据插入数据库的实现代码 最近有一个需求,前端向后台提交json,后台解析并且将提交的值插入数据库中,难点1、php解析json(这个不算难点了,网上实例一抓一大把)2、解析json

thinkphp微信开发(消息加密解密) 使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录。分析问题:解密微信服务器消息老是不成功,

标签: php fork

本文链接地址:https://www.jiuchutong.com/biancheng/275601.html 转载请保留说明!

上一篇:简单了解PHP编程中数组的指针的使用(简单了解php编程软件)

下一篇:使用Huagepage和PGO来提升PHP7的执行性能

  • 进项税额转出怎么操作
  • 三个案例看清增值税即征即退?
  • 承兑可以要吗
  • 增值税普通发票有什么用
  • 视同销售计入销售费用能税前扣除吗
  • 政府会计制度中累计盈余怎么计算
  • 烟叶收购方案制定步骤
  • 企业进行税收筹划
  • 银行现金解款单回单怎么填
  • 分公司收到的总部拨款会计如何处理
  • 固定资产损失如何计提
  • 建筑安装企业成本费用包括哪些
  • 公司的钱怎么转出来
  • 运输营改增
  • 雇主责任险能否证明劳动关系
  • 企业所得税少交了被税局查到怎么处理
  • 出口退税对企业利润的影响
  • 学校应该缴纳的税
  • 速达财务软件使用说明
  • 营改增政策解读
  • 企业加入的协会有哪些
  • 社保打的生育保险怎么做账
  • 苹果电脑macos big sur
  • 电脑黑屏怎么办主机还是亮的
  • 公司股权转让会议决议
  • 缴纳当月增值税30000元
  • 税务发票盖章要求
  • 赠品如何做兑换码
  • 抵扣了的进项税可以冲销么
  • 坏账准备怎么做会计科目
  • 商品流通企业会计科目表
  • php开发实战权威指南
  • 回迁房会被收回吗
  • 对于企业无法支付的应付账款
  • html流光按钮
  • 2023年highway-env更新之后的使用记录(含DDQN,DuelingDQN,DDQN+OtherChanges) 入门到入土,再踩坑就不玩原神了
  • php实现将base64格式图片保存在指定目录的方法
  • 发票校验码的作用
  • 农村合作社不报税会导致经营异常吗
  • 预收的贷方余额表示什么
  • 进口货物的报关成交方式
  • 管理费用的核算内容主要包括哪些
  • db2 -968
  • 内账中采购另付的税点算成本还是费用
  • 原始凭证的种类划分
  • 增值税扣缴义务发生时间为扣缴义务人扣缴税款的当天
  • 公司投资款如何返还给股东
  • 税务上可以先收现金吗
  • 银行收到一笔款项企业尚未入账属于什么情况的未达账项
  • 展会赠品
  • 公司每个月申报怎么报的
  • 开发成本六大类
  • 收到专票可以不签字吗
  • 短期投资怎么记账
  • vmware workstation中的虚拟机的终端
  • win2000安装过程
  • mac怎么打开terminal
  • window10与CentOS双系统安装详细教程
  • 如何清理注册表的垃圾文件
  • win8系统无法开机如何备份数据
  • 运行方式包括什么方式
  • f11一键恢复系统详解
  • centos7 目录结构
  • win8打开ie
  • win8任务栏点击没反应
  • win10系统经典桌面
  • Ubuntu 下搭建网站服务器
  • windows恢复版本
  • bat批处理脚本教程
  • cocos2048
  • unity3d ik
  • unity摄像机在哪里
  • jquery model
  • nodejs客户端程序开发
  • android ashmem
  • web.py 十分钟创建简易博客实现代码
  • Python3使用requests发闪存的方法
  • 税务局执法不规范整改
  • 税票开错了税费怎么退回来
  • 征求意见稿 讨论稿 送审稿
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设