php7整理-语言修改方面
2020-03-23 10:58:51 来源:admin 点击:831
一、间接变量、属性和方法引用都按照从左到右的顺序进行解释:
$$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz']
$foo->$bar['baz'] // interpreted as ($foo->$bar)['baz']
$foo->$bar['baz']() // interpreted as ($foo->$bar)['baz']()
Foo::$bar['baz']() // interpreted as (Foo::$bar)['baz']()
如果想改变解释的顺序,可以使用大括号:
${$foo['bar']['baz']}
$foo->{$bar['baz']}
$foo->{$bar['baz']}()
Foo::{$bar['baz']}()
二、global关键字现在只能引用简单变量
global $$foo->bar; // 这种写法不支持。
global ${$foo->bar}; // 需用大括号来达到效果。
三、用括号把变量或者函数括起来没有用了
function getArray() { return [1, 2, 3]; }
$last = array_pop(getArray());
// Strict Standards: Only variables should be passed by reference
$last = array_pop((getArray()));
// Strict Standards: Only variables should be passed by reference
注意第二句的调用,是用圆括号包了起来,但还是报这个严格错误。之前版本的PHP是不会报这个错误的。
四、引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了。
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
PHP7产生的数组:["a" => 1, "b" => 1]
PHP5产生的数组:["b" => 1, "a" => 1]
list()函数
一、list()不再按照相反的顺序赋值
list($array[], $array[], $array[]) = [1, 2, 3];
var_dump($array);
上面的代码会返回一个数组:$array == [1, 2, 3] 而不是之前的 [3, 2, 1]
注意:只是赋值的顺序发生变化,赋的值还是和原来一样的。
list($a, $b, $c) = [1, 2, 3];
// $a = 1; $b = 2; $c = 3;
和原来的行为还是一样的。
二、空的list()赋值不再允许。
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;
上面的这些代码运行起来会报错了。
三、list()不在支持字符串拆分功能
$string = "xy";
list($x, $y) = $string;
这段代码最终的结果是:$x == null and $y == null (不会有提示)
PHP5运行的结果是: $x == "x" and $y == "y".
四、除此之外,list()现在也适用于数组对象:
list($a, $b) = (object) new ArrayObject([0, 1]);
PHP7结果:$a == 0 and $b == 1.
PHP5结果:$a == null and $b == null.
foreach函数
一、foreach()循环对数组内部指针不再起作用。
$array = [0, 1, 2];
foreach ($array as &$val)
{
var_dump(current($array));
}
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)"。
内置函数的修改
substr()方法在边界切分的时候会返回一个空字符串,不再返回FALSE.
call_user_method() and call_user_method_array() 被删除了。
当一个输出缓冲是在另外一个输出缓冲处理器创建时,ob_start()返回E_RECOVERABLE_ERROR错误,不再返回E_RROR错误。
优化了内置的排序算法,对相等元素的排序可能和之前不同。
fpm-fcgi移除了dl()函数。
setcookie() 如果设置一个没有名字的cookie,会产生一个 WARNING错误,不再发送空的set-cookie 头信息。
parse_ini_file()和parse_ini_string()的scanner_mode参数增加了INI_SCANNER_TYPED选项。
unserialize()增加了第二个参数,可以用来指定接受的类列表。RFC: https://wiki.php.net/rfc/secure_unserialize
proc_open()打开的最大限制之前是写死的16,现在这个限制被移除了,最大数量取决于PHP可用的内存。windows版本增加了选项"blocking_pipes",可用来指定是否强制以块的方式读取。
array_column():The function now supports an array of objects as well as two-dimensional arrays
stream_context_create()windows下面可以接收array("pipe" => array("blocking" => <boolean>))参数。
dirname()增加了可选项$levels,可以用来指定目录的层级。dirname(dirname($foo)) => dirname($foo, 2);
debug_zval_dump()打印的时候,使用int代替long,使用float代替double。
下面的这些保留字不能用作类名、接口名和trait名。
bool
int
float
string
null
false
true