PHP7.1函数相关变更
list()现在支持键名
现在list()
和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)
<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
// [] style
["id" => $id1, "name" => $name1] = $data[0];
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
// logic here with $id and $name
}
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
// logic here with $id and $name
}
禁止动态调用的函数
如下:
- assert() - with a string as the first argument
- compact()
- extract()
- func_get_args()
- func_get_arg()
- func_num_args()
- get_defined_vars()
- mb_parse_str() - with one arg
- parse_str() - with one arg
尾随的-
代表禁止动态调用的条件。func_get_args
等几个函数测试了下好像并没有禁止动态调用?不太懂。
unserialize
对allowed_classes
参数严格化,如果对其传入的值是布尔值和数组之外的内容,unserialize
将返回False和E_WARNING
getenv可以不需要传入参数
getenv()
可以不传入任何参数。 如果不传入参数,此函数会以关联数组的形式 返回所有的环境变量。
parse_url支持RFC3986
parse_url()
更加严格的限制, 并且提供对 RFC3986 的支持。
session_start将返回false
session_start()
当无法成功初始化会话的时候,返回 FALSE, 并且不会初始化超级变量 $_SESSION
。
但是我测试的时候发现,PHP7.0已经会返回False了(Win+PHP7.12nts
<?php
@var_dump(session_start('11'));
@var_dump($_SESSION);
# 结果
/*
php5
bool(true)
array(0) {
}
PHP5
bool(false)
NULL
(废弃)两个函数的Eval选项
mb_ereg_replace()和mb_eregi_replace()
(废弃)ext/mcrypt
PHP7.1语法相关的变更
(增加)短数组
短数组语法[]
现在作为list()
语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)。
<?php
$data = [
[1, 'Tom'],
[2, 'Fred'],
];
var_dump($data);
// list() style
list($id1, $name1) = $data[0];
// [] style
#[$id1, $name1] = $data[0];
// list() style
foreach ($data as list($id, $name)) {
echo "$id $name\n";
// logic here with $id and $name
}
// [] style
foreach ($data as [$id, $name]) {
// logic here with $id and $name
}
(增加)支持为负的字符串偏移量
现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]
或{}
操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。
<?php
var_dump("abcdef"[-2]); // string (1) "e"
var_dump(strpos("aabbcc", "b", -3)); // int(3)
字符串也同样支持
<?php
$string = 'bar';
echo "The last character of '$string' is '$string[-1]'.\n";
# 结果
/*
The last character of 'bar' is 'r'.
*/
(增加)当传递参数过少时将抛出错误
在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception),意味着PHP会中断执行。这个变更仅对用户定义的函数生效, 并不包含内置函数。例如:
<?php
function test($param){
echo "1\n";
}
system();
test();
引用数组元素创建元素的顺序更改
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
# 结果
/*
PHP7.0
array(2) {
["a"]=>
&int(1)
["b"]=>
&int(1)
}
PHP7.1
array(2) {
["b"]=>
&int(1)
["a"]=>
&int(1)
}
*/
JSON编码和解码
解码一个空键值将会解析为一个空属性名,而之前会解析为_empty_
<?php
var_dump(json_decode(json_encode(['' => 1])));
# 结果
/*
PHP<7.1
object(stdClass)#1 (1) {
["_empty_"]=>
int(1)
}
PHP7.1
object(stdClass)#1 (1) {
[""]=>
int(1)
}