PHP7新特性foreach 修改

   2016-08-30 0
核心提示:一、foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。现在开始,不再如此,见下面代码$array = [0, 1, 2];foreach ($array as &$val){var_dump(current($array));}PHP5运行的结果会打印int(1) int(2) bool(fals

一、foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。现在开始,不再如此,见下面代码

$array = [0, 1, 2];
foreach ($array as &$val)
{
var_dump(current($array));
}

PHP5运行的结果会打印int(1) int(2) bool(false)

PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。

之前运行的结果会打印int(1), int(2)和bool(false)

二、按照值进行循环的时候,foreach是对该数组的拷贝操作

foreach按照值进行循环的时候(by-value),foreach是对该数组的一个拷贝进行操作。这样在循环过程中对数组做的修改是不会影响循环行为的。

$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}

上面的代码虽然在循环中把数组的第二个元素unset掉,但PHP7还是会把三个元素打印出来:(0 1 2)

之前老版本的PHP会把1跳过,只打印(0 2).

三、按照引用进行循环的时候,对数组的修改会影响循环。

如果在循环的时候是引用的方式,对数组的修改会影响循环行为。不过PHP7版本优化了很多场景下面位置的维护。比如在循环时往数组中追加元素。

$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}

上面的代码中追加的元素也会参与循环,这样PHP7会打印"int(0) int(1)",老版本只会打印"int(0)"。

四、对简单对象plain (non-Traversable) 的循环。

对简单对象的循环,不管是按照值循环还是按引用循环,和按照引用对数组循环的行为是一样的。不过对位置的管理会更加精确。

五、对迭代对象(Traversable objects)对象行为和之前一致。

编者按:stackoverflow上面的解释:Traversable object is one that implements Iterator or IteratorAggregate interface。如果一个对象实现了iterator或者IteratorAggregate接口,即可称之为迭代对象。

参考:

Relevant RFC: https://wiki.php.net/rfc/php7_foreach

本文链接: http://www.phpxs.com/j/php7/1001229

 
标签: PHP7
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • php7.2.4安装rabbitmq扩展的过程中错误处理
    1、根据自己php的版本选择 amqp包的版本,我开始随便选择了amqp-1.6.1.tar.gz make之后出现如下错误:/opt/amqp-1.6.1/amqp.c:984:37: error: too many arguments to function ‘zend_register_internal_class_ex’amqp_queue_exception_class_entry
    02-09
  • tp5+php7 实现发送邮件(qq邮箱和企业邮箱均验证)
    tp5+php7 实现发送邮件(qq邮箱和企业邮箱均验
    一:   准备工作              1:phpmailer核心文件下载地址:https://github.com/PHPMailer/PHPMailer               2、PHP扩展开启,openssl和sockets,打开php.ini文件,将这两个扩展钱的;号去掉。                    ①  
    02-09
  • 第二章:php7扩展开发[2] 怎么样创建类
    1.创建扩展进入${php-src}/ext目录,执行./ext_skel--extname=route,这时目录下会出现一个route的目录,cd ./route2.修改config.m4内容第十行左右,去掉dnlPHP_ARG_WITH(route, for route support,dnl Make sure that the comment is aligned:[ --with-route
    02-09
  • PHP之Trait详解 php7 trait
    PHP之Trait详解 php7 trait
    php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化 与普通类的异同:相同:t
    02-09
  • ubuntu14.04 安装apache+php7.2*
    1.安装apache2   sudo apt-get update  sudo apt-get install apache2  这时http://你机器的ip,就可以访问了   2.安装php7.0+及一些必要的扩展   apt-get install software-properties-common python-software-properties add-apt-repository p
    02-09
  • PHP7新功能及语法变化总结 PHP新特性
    1、标量类型声明有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。2、返回值类型声明返回类型声明指明了函数返回值的类型。可用的类型与参
    02-09
  • php7修改时区无效如何解决
    这篇文章主要介绍“php7修改时区无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php7修改时区无效如何解决”文章能帮助大家解决问题。php7修改时区无效的解决办法:1、从代码中动态修改时区,从而获
    02-08 php
  • PHP7框架之Lumen之Hello World。
    背景:听说Lumen起家是以一个叫av的框架,larvael。以Auth2.0起步,Lumen是精简版本,于是想了解一下。发现居然边TM路由就卡住了,Fuck,不光是我老外也有这个问题,都没有解决,主要是一个Nginx的转写问题,这块在Lumen的文档里写的很垃圾,我都不知这些人是
    02-05 PHP7
  • 亿级用户PC主站的PHP7升级实践
    亿级用户PC主站的PHP7升级实践
    伴随业务的增长,系统压力也在不断增加,再加上机房机架趋于饱和,无法更加有效应对各种突发事件。在这样的情况下,PC主站升级为PHP 7,有哪些技术细节可以分享?背景新浪微博在2016年Q2季度公布月活跃用户(MAU)较上年同期增长33%,至2.82亿;日活跃用户(D
    02-05 PHP7
  • PHP7 内核分析:变量的设计
    变量的结构变量的数据结构变量保存在zval的结构体中(与 PHP5 相同,但数据结构做了很大改变)。zval结构体定义在Zend/zend_types.h文件中,结构体如下:typedef struct _zval_struct zval;struct _zval_struct {zend_valuevalue;/* value */union {struct {Z
    02-05 PHP7
点击排行