自动创建元素的顺序改变
在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。
标签:web,结果,list,循环,PHP8,数组,PHP5 From: https://blog.51cto.com/micai01/6404282