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

举报
迷彩 发表于 2023/07/21 23:35:04 2023/07/21
【摘要】 自动创建元素的顺序改变在PHP8中,引用赋值时,自动创建的数组元素或者对象属性的顺序和PHP7版本相比发生了变化,下面我们通过例子来体验下变化在哪里.<?php$array = [];$array['a'] = &$array['b'];$array['b'] = 1;echo "\n";var_dump($array);?>执行结果如下:这个结果是PHP8运行之后的结果,而在PHP7的版本...

自动创建元素的顺序改变

在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()函数按照相反的顺序赋值.

<?php
list($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中不再允许赋空值,具体代码如下:

<?php
list() = $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.可以用于数组对象

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

<?php
list($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。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。