不向后兼容的变更
当传递参数过少时将抛出错误
在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生警告(warning)。现在,这个警告被提升为错误异常(Error
exception)。这个变更仅对用户定义的函数生效,并不包含内置函数。例如:
禁止动态调用作用域内的内省(introspection)函数
禁止动态调用($func()
或 array_map('extract', ...)
的形式等)某些函数。这些函数会检查或修改另一个作用域,并呈现出不明确且不可靠的行为。函数如下:
无效的 class、interface 和 trait 名称
下列名称不能用于 class、interfaces 或 traits 名:
禁止在标识符中使用 ASCII 删除控制字符
ASCII 删除控制字符(0x7F
)不能用于未加引号的标识符中。
error_log
更改为 syslog
值
如果 error_log
ini 设置为 syslog
,PHP 错误等级会映射到 syslog
错误级别。这在错误日志中带来了更好的区分,与之前相反,之前所有的错误只记录了错误级别。
在不完整的对象上不再调用析构方法
对于在执行构造方法时抛出异常的对象,现在析构方法绝不会被调用。在先前的版本中,这个行为取决于对象是否在构造方法以外的地方呗引用(例如一个错误堆栈回溯)
字符串不再支持空索引操作符
对字符串使用一个空索引操作符(例如$str[] = $x
)将会抛出一个致命错误,而不是静默地将其转为一个数组。
ini 配置项移除
下列 ini 配置项已经被移除:
-
session.entropy_file
-
session.entropy_length
-
session.hash_function
-
session.hash_bits_per_character
在引用赋值期间自动创建元素时的数组排序已更改
当通过引用赋值自动创建这些元素时,数组中元素的顺序就会发生变化。例如:
相等元素的排序顺序
内部排序算法已得到改进,这可能会导致元素比较相等的排序顺序与以前不同。
注意:
不要依赖比较相等的元素的顺序;它可能随时改变。
E_RECOVERABLE 错误的错误消息
E_RECOVERABLE 错误的错误消息已从“可捕获的致命错误”更改为“可恢复的致命错误”。
unserialize() 的 $options 参数
unserialize() 的 $options 参数的 allowed_classes
元素现在是严格类型,也就是说,如果指定了 array 或 bool 以外的任何内容,则
unserialize() 返回 false
并发出 E_WARNING
。
DateTime 构造方法包含微秒
DateTime 和 DateTimeImmutable
现在构造当前时间时正确地包含微秒,无论是明确指定的还是使用相对字符串(例如 "first day of next
month"
)。这意味着两个新创建的实例的原生比较现在更有可能返回 false
而不是 true
:
词法绑定变量不能重用名字
通过 use
构造绑定到 closure
的变量不能使用与任何 superglobals、$this 或任何参数相同的名称。例如,所有这些函数定义都会导致致命错误:
JSON 编/解码
serialize_precision
ini 设置现在控制编码 float 时的序列化精度。
解码空键(empty key)现在会产生空属性,而不是 _empty_
作为属性名称。
当向 json_encode() 提供 JSON_UNESCAPED_UNICODE
flag 时,现在转义序列 U+2028 和 U+2029。
放弃对 sslv2 stream 的支持
sslv2 stream 现已在 OpenSSL 中删除。
在编译时禁止 "return;" 用于类型化返回
在声明返回类型的函数中,没有参数的 return 语句现在触发 E_COMPILE_ERROR
(除非返回类型声明为
void),即使永远不会到达 return 语句。