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
}

禁止动态调用的函数

如下:

尾随的-代表禁止动态调用的条件。func_get_args等几个函数测试了下好像并没有禁止动态调用?不太懂。

unserialize

allowed_classes参数严格化,如果对其传入的值是布尔值数组之外的内容,unserialize将返回FalseE_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)
}

杂项

可为空(Nullable)类型

Void 函数

类常量可见性

iterable 伪类

多异常捕获处理

Invalid class, interface, and trait names

Numerical string conversions now respect scientific notation

Fixes to mt_rand() algorithm

rand() aliased to mt_rand() and srand() aliased to mt_srand()

Disallow the ASCII delete control character in identifiers

在不完整的对象上不再调用析构方法

call_user_func()不再支持对传址的函数的调用

ini配置项移除

Sort order of equal elements

Lexically bound variables cannot reuse names

results matching ""

    No results matching ""