之前版本中,number_format()
有可能会返回 -0
。虽然这是符合 IEEE 754
规范的,但是这样会导致可读性不好,新版本中会将这样的负数去掉。
<?php
var_dump(number_format(-0.01)); // 新版本输出 string(1) "0" 旧版本输出 string(2) "-0"
将数组转换为对象,或将对象转换为数组时,数字键现在得到了更好的处理(无论是通过显式转换还是通过 settype() 函数)。
这意味着现在可以访问数组中的整数(或者说是字符串整数)键,这些键会映射到对象中:
<?php
// array to object
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
$obj,
$obj->{'0'}, // 新写法
$obj->{0} // 新写法
);
以上示例会输出:
object(stdClass)#1 (1) { ["0"]=> // 现在是字符串 key,而不是整数 key int(1) } int(1) int(1)
从对象转换成的数组中的整数(或者说是字符串整数)键现在也可以直接访问:
<?php
// object to array
$obj = new class {
public function __construct()
{
$this->{0} = 1;
}
};
$arr = (array)$obj;
var_dump(
$arr,
$arr[0], // 新写法
$arr['0'] // 新写法
);
以上示例会输出:
array(1) { [0]=> // 现在是整数 key,而不是字符串 key int(1) } int(1) int(1)
null
参数
之前版本中,传递 null
给 get_class()
函数将返回当前类名。在新版本中,此行为会抛出一个
E_WARNING
错误。如果想实现与之前版本同样的效果,请不要传递任何参数进来。
对非可数类型调用 count()(或
sizeof())函数,会抛出一个
E_WARNING
错误。
<?php
var_dump(
count(null), // NULL 不可数
count(1), // 整数不可数
count('abc'), // 字符串不可数
count(new stdClass), // 没有实现 Countable 接口的对象不可数
count([1,2]) // 数组可数
);
以上示例会输出:
Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d int(0) int(1) int(1) int(1) int(2)
作为长期迁移资源的一部分,Hash 扩展已更新为使用对象而不是资源。对于 PHP 开发人员来说,该更改应该是无缝整合,除了 is_resource() 检查的地方(需要更新为 is_object())。
下列默认选项被修改:
tls://
默认为 TLSv1.0、TLSv1.1 或 TLSv1.2
ssl://
成为 tls://
的别名
STREAM_CRYPTO_METHOD_TLS_*
常量默认为 TLSv1.0
或 TLSv1.1 + TLSv1.2,替代之前的 TLSv1.0
之前版本中,如果在一个闭包资源中使用 gettype()
会返回字符串 "unknown type"
,现在将会返回字符
"resource (closed)"
。
之前版本中,对 __PHP_Incomplete_Class
调用 is_object() 函数会返回
false
,现在会返回 true
。
官方支持的最低 Windows 版本为 Windows 7/Server 2008 R2。
对 trait 默认属性值的兼容性检查将不再执行强制转换。
object
保留字的变化
object
在之前的 PHP 7.0 版本
中被声明为软保留字(soft-reserved)。现在变更为强制保留字,禁止在任何类或接口中使用该名称。
不再支持 NetWare。
SORT_STRING
的 array_unique()
带 SORT_STRING
的
array_unique(),之前复制数组并删除唯一元素(之后不会打包元素),但现在通过添加唯一元素来构建新数组。这可能会导致不同的数字索引。
bcmod() 函数不再将小数截断为整数。因此,其行为现在遵循 fmod(),而不是
%
运算符。例如 bcmod('4', '3.5')
现在返回 0.5
而不是 1
。
hash_hmac()、hash_hmac_file()、hash_pbkdf2()
和 hash_init()(使用 HASH_HMAC
)函数将不再接受非加密散列。
如果 json_decode() 的第二个选项(assoc) 为 null
,则现在会使用
JSON_OBJECT_AS_ARRAY
,之前始终会忽略 JSON_OBJECT_AS_ARRAY
。
在 64 位机器上,自 PHP 7.1 起,由 rand() 和 mt_rand() 为特定的种子生成的一系列随机数可能与之前版本不同(å在实现中修复了一个模偏置错误)。
sql.safe_mode
ini 选项移除
sql.safe_mode
ini 设置项已被移除。
date_parse() 和 date_parse_from_format() 返回数组的 zone
元素现在表示秒而不是分钟,并且其符号反转。例如 -120
现在是 7200
。
自 PHP 7.2.34 起,出于安全原因,传入 cookie 的 names 不再进行 url 解码。