不向后兼容的变更
PHP 核心中不向后兼容的变更
fn
关键词
fn
成为了保留关键词。需要特别注意,它不能再做为函数名或类名使用,但是仍然可以做为方法名和常量名存在。
文件尾部的 <?php
标签
文件尾部的 <?php
标签(不包含空行)将会被解释成 PHP 起始标记。之前,不是解释为短开始标记,后跟文字 php
并导致语法错误(short_open_tag=1
),就是解释为文字 <?php
字符串(short_open_tag=0
)。
Serialization 序列化
序列化类型 o
被移除。因为它不是由 PHP
生成的,这可能会影响到之前项目中手动生成的序列化字符串。
密码算法常量
密码哈希算法标识符现在是可空字符串,而不再是整数。
-
PASSWORD_DEFAULT
之前是 int 1; 现在是“2y”(在 PHP 7.4.0、7.4.1、7.4.2 中是 null
)
-
PASSWORD_BCRYPT
之前是 int 1; 现在是 string '2y'
-
PASSWORD_ARGON2I
之前是 int 2; 现在是 string 'argon2i'
-
PASSWORD_ARGON2ID
之前是 int 3; 现在是 string 'argon2id'
应用中如果正常使用了常量 PASSWORD_DEFAULT,PASSWORD_BCRYPT,PASSWORD_ARGON2I
和 PASSWORD_ARGON2ID 将不会受到影响。
fread() 和 fwrite()
在操作失败的时候会返回 false
。之前的版本中会返回空字符串或 0。EAGAIN/EWOULDBLOCK 不视为故障。
这些函数现在也会在失败时发出 NOTICE 通知,例如当试图写入一个只读文件资源时。
BCMath 任意精度数学
如果传递了例如 "32foo"
这种格式不正确的数字,BCMath 函数现在将发出警告。和以前一样,参数将解释为 0。
CURL
现在尝试序列化 CURLFile 类将会生成异常。之前仅会在反序列化时引发。
弃用 CURLPIPE_HTTP1
,并在 cURL 7.62.0 起不再支持。
弃用 curl_version() 的 $version
参数。如果传递了任何不等于默认
CURLVERSION_NOW
的值,则会引发警告并忽略参数。
MySQLi
内嵌服务器功能已移除。自 PHP 7.0 起就已破坏了。
未记录的 mysqli::$stat
属性已移除,以支持 mysqli::stat()。
正则表达式(Perl 兼容)
当使用 PREG_UNMATCHED_AS_NULL
模式时,后跟不匹配的捕获组现在也将设置为 null
(如果启用了偏移捕获,则为 [null, -1]
)。这意味着 $matches
的大小将始终相同。
Tokenizer
token_get_all() 现在将为非法字符发出 T_BAD_CHARACTER
token,而不是在 token stream 中留下漏洞。
接收到的 Cookies
从 PHP 7.4.11 开始,为了安全考虑,接受到的 Cookie 中的 names 参数不再被
URL 编码。