向后不兼容
虽然大部分 PHP 5 的代码无需修改即可正常运行, 但是有部分代码是无法向后兼容的:
使用数组标识符为类定义数组类型的属性时,数组的键不会被覆盖
在 PHP 5.6 之前的版本中,为类定义数组类型的属性时, 如果数组中同时使用了显式数组键和隐式数组键,并且显式的键和隐式的序列键相同, 那么数组的键将被覆盖。例如:

严格的 json_decode()
对于 JSON 字面量 true,false 和 null,如果不采用小写格式,将会被 json_decode() 函数拒绝, 同时相应的设置 json_last_error()。 在之前的版本中,json_decode() 函数可以接受这些字面量的 全部大写或者大小写混写的格式。
此变更仅会影响传入到 json_decode() 中的 JSON 格式无效的情况, 有效的 JSON 输入不会受到影响并且能够正确解析。
Mcrypt 函数需要有效长度的密钥和初始向量
mcrypt_encrypt(),mcrypt_decrypt(), mcrypt_cbc(),mcrypt_cfb(), mcrypt_ecb(),mcrypt_generic() 以及 mcrypt_ofb() 函数不再接受无效长度的密钥和初始向量, 对于需要初始向量的分组加密模式,如果不提供初始向量,函数调用将会失败。
cURL 文件上传
必须先设置 CURLOPT_SAFE_UPLOAD 为 FALSE 才能够使用 @file 语法来上传文件。 建议使用 CURLFile 类来上传文件。
新特性
使用表达式定义常量
在之前的 PHP 版本中, 必须使用静态值来定义常量,声明属性以及指定函数参数默认值。 现在你可以使用包括数值、字符串字面量以及其他常量在内的数值表达式来 定义常量、声明属性以及设置函数参数默认值。

现在可以通过 const 关键字来定义类型为 array 的常量。
const ARR = ['a', 'b'];
echo ARR[0];
使用 ... 运算符定义变长参数函数
现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数。
function f($req, $opt = null, ...$params) { // $params 是一个包含了剩余参数的数组
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
使用 ... 运算符进行参数展开
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
使用 ** 进行幂运算
加入右连接运算符 ** 来进行幂运算。 同时还支持简写的 **= 运算符,表示进行幂运算并赋值。
use function 以及 use const
use 运算符 被进行了扩展以支持在类中导入外部的函数和常量。 对应的结构为 use function 和 use const。

默认字符编码
对于一些字符编码相关的函数,例如 htmlentities(), html_entity_decode() 以及 htmlspecialchars() 使用 default_charset 作为默认字符集。请注意,对于 iconv(现已废弃) 和 mbstring 相关的函数, 如果分别设置了他们的编码, 那么这些对应设置的优先级高于 default_charset。
default_charset 的默认值是 UTF-8。
php://input 是可重用的了
只要你需要,你可以多次打开并读取 php://input。 同时,这个特性使得在处理 POST 的数据的时候, 可以明显降低对于内存的需求量。
大文件上传
现在可以支持大于 2GB 的文件上传。
函数的变化
PHP 内核
如果省略 salt 参数,crypt() 会产生 E_NOTICE错误。
substr_compare() 的 length 参数现在接受 0 的值。
unserialize() 如果传递的序列化数据已被操作以尝试在不调用其构造函数的情况下实例化对象,则现在将失败。
cURL
只有设置 CURLOPT_SAFE_UPLOAD 为 FALSE 的情况下, 才接受 @file 语法上传文件。 最好使用 CURLFile 代替。
Mcrypt
mcrypt_create_iv() 的 source 现在默认值是 MCRYPT_DEV_URANDOM,而非 MCRYPT_DEV_RANDOM。
OpenSSL
如果 SSL 上下文选项已经提供 crypto_type 选项, stream_socket_enable_crypto() 可以忽略 crypto_type 参数。
新加的函数
日期和时间 DateTimeImmutable::createFromMutable()
GMP
Hash
LDAP
MySQLi
OCI8
OpenSSL
openssl_spki_export_challenge()
网友评论