写点什么

【web 开发基础】PHP8 中对数组操作的新变化(56)

作者:迷彩
  • 2022-12-31
    广东
  • 本文字数:1359 字

    阅读完需:约 4 分钟

自动创建元素的顺序改变

在 PHP8 中,引用赋值时,自动创建的数组元素或者对象属性的顺序和 PHP7 版本相比发生了变化,下面我们通过例子来体验下变化在哪里.


<?php$array = [];$array['a'] = &$array['b'];$array['b'] = 1;echo "\n";var_dump($array);?>
复制代码

执行结果如下:

这个结果是 PHP8 运行之后的结果,而在 PHP7 的版本中元素的位置不会自动创建元素的顺序,而 PHP 会根据引用自动创建元素的顺序.


PHP8 中 list()函数修改数组的改变

在 PHP8 中 list()函数的功能发生以下改变:

1.不再按照相反的顺序赋值

在 PHP8 中,list()函数不再按照相反的顺序赋值,而在 PHP5 中,list()函数按照相反的顺序赋值.

<?phplist($array[],$array[],$array[],$array[]) = [10,20,30,40];
var_dump($array);?>
复制代码

PHP8 中的执行结果如下:

从结果可以看出,虽然赋值没有变化,但是赋值的顺序发生了变化,在 PHP8 中,返回的数组 $array == [10,20,30,40].在 PHP5 中,返回的数组 $array == [40,30,20,10]


2.不再允许赋空值

在 PHP8 中不再允许赋空值,具体代码如下:

<?phplist() = $a;list() = $a;list($x, list(), $y) = $a;
复制代码

上面的代码在 PHP8 中运行会直接报错,而在 PHP5 中,list()是允许赋空值的.


3.不再支持字符串拆分功能

在 PHP8 中,list()函数不再支持字符串拆分功能.具体代码如下:

<?php$string = "xy";list($x, $y) = $string;echo "$x";echo "$y";?>
复制代码

在 PHP8 中运行直接报错,显示语法解析错误,而在 PHP5 中上述代码最终的结果是:$x == "x" and $y == "y"


4.可以用于数组对象

我们先来看看代码,再说结论:

<?phplist($a, $b, $c) = (object) new ArrayObject([10,20,30]);echo "$a\n";echo "$b\n";echo "$c\n";?>
复制代码

执行结果如下:

在 PHP8 中,上述代码最终的结果是 $a == 10 and $b == 20 and $c == 30.而在 PHP5 中,上述代码最终的结果是:$a == null and $b == null and $c == null,而且不会有提示.运行一片空白.


foreach()函数修改数组的改变


在 PHP8 中,foreach()函数的功能也发生了变化.


1.对内部指针失效

在 PHP8 中,foreach()循环对数组内部指针不再起作用.

<?php$array = [1,2,3];foreach($array as &$a){	var_dump(current($array));           		}
复制代码

在 PHP8 中运行的运行结果如下:

结果会打印三次 int(1),也就是说数组的内部指针并没有改变.在 PHP5 中运行的结果会显示:int 1, int 2,和 boolean false.


2.按照值进行循环时,修改数组不再影响循环行为

在 PHP8 中,foreach()按照值进行循环的时候,foreach()是对该数组的一个复制操作.这样在循环过程中对数组做的修改是不会改变影响循环行为的.

<?php$array = [100,200,300];$ref =& $array;foreach ($array as $val) {    unset($array[1]);    echo "数组值: " . $val . "\n";}?>
复制代码

执行结果如下:

在 PHP 8 中,上面的代码虽然在循环中把数组的第 2 个元素销毁掉了,还是会把数组的 3 个元素全部打印出来。而在 PHP 5 中,上面的代码只会把 2 个元素打印出来(100、300)。


3.按照引用进行循环时,对数组的修改会影响循环

如果在循环的时候使用引用的方式,对数组的修改就会影响循环行为。

<?php$array = [100];foreach ($array as &$val) {    echo "数组值: " . $val . "<br/>";    $array[1] =200;    $array[2] =300;}?>
复制代码

执行结果如下:


在 PHP 8 中,追加的元素也会参与循环,结果会打印 100、200、300; 而在 PHP 5 中,追加的元素不会参与循环,结果只会打印 100。

发布于: 刚刚阅读数: 4
用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020-06-18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
【web 开发基础】PHP8中对数组操作的新变化(56)_List_迷彩_InfoQ写作社区