向后不兼容的更改

PHP 核心

非数组的数组样式访问

尝试将类型为 nullboolintfloatresource 的值用作数组(例如 $null["key"])现在将生成一个通知。

get_declared_classes() 函数

get_declared_classes() 函数不再返回尚未实例化的匿名类。

fn 关键字

fn 现在是保留关键字。特别是,它不能再用作函数或类名。它仍然可以作为方法或类常量名使用。

<?php 标签在文件末尾

文件末尾的 <?php(没有尾随换行符)现在将被解释为打开的 PHP 标签。以前它被解释为短打开标签后跟文字 php,并导致语法错误(使用 short_open_tag=1),或者被解释为文字 <?php 字符串(使用 short_open_tag=0)。

流包装器

在流上使用 include/require 时,streamWrapper::stream_set_option() 将使用 STREAM_OPTION_READ_BUFFER 选项调用。自定义流包装器实现可能需要实现 streamWrapper::stream_set_option() 方法以避免警告(始终返回 false 就足够了)。

序列化

已删除 o 序列化格式。由于它从未由 PHP 生成,因此这可能只会破坏对手动制作的字符串的 unserialization。

密码算法常量

密码散列算法标识符现在是可空字符串,而不是整数。

正确使用常量 PASSWORD_DEFAULT、PASSWORD_BCRYPT、PASSWORD_ARGON2I 和 PASSWORD_ARGON2ID 的应用程序将继续正常工作。

htmlentities() 函数

如果 htmlentities() 与仅支持基本实体替换的编码一起使用,它现在将引发通知(而不是严格的标准警告),在这种情况下,它等效于 htmlspecialchars()

fread()fwrite() 函数

如果操作失败,fread()fwrite() 现在将返回 false。以前返回空字符串或 0。EAGAIN/EWOULDBLOCK 不被视为失败。

这些函数现在还会在失败时引发通知,例如尝试写入只读文件资源时。

BCMath 高精度数学

如果传递非格式良好的数字,例如 "32foo",BCMath 函数现在将发出警告。与以前一样,该参数将被解释为零。

CURL

尝试序列化 CURLFile 类现在将生成一个异常。以前,该异常仅在 unserialization 时抛出。

使用 CURLPIPE_HTTP1 已弃用,并且从 cURL 7.62.0 开始不再支持。

curl_version()$version 参数已弃用。如果传递任何不等于默认值 CURLVERSION_NOW 的值,则会发出警告,并且参数将被忽略。

日期和时间

DateTimeDateTimeImmutable 实例上调用 var_dump() 或类似方法现在将不再在对象上留下可访问的属性。

DateInterval 对象的比较(使用 ==< 等)现在将生成一个警告,并始终返回 false。以前所有 DateInterval 对象都被认为是相等的,除非它们具有属性。

Intl

idn_to_ascii()idn_to_utf8() 的默认参数值现在是 INTL_IDNA_VARIANT_UTS46,而不是已弃用的 INTL_IDNA_VARIANT_2003

MySQLi

已删除嵌入式服务器功能。它至少从 PHP 7.0 开始就已损坏。

已弃用未记录的 mysqli::$stat 属性,取而代之的是 mysqli::stat()

OpenSSL

openssl_random_pseudo_bytes() 函数现在将在错误情况下抛出异常,类似于 random_bytes()。特别是,如果请求的字节数小于或等于零,则会抛出 Error,如果无法收集足够的随机性,则会抛出 Exception。如果函数不抛出,则输出参数 $crypto_strong 保证始终为 true,因此不需要显式检查它。

正则表达式(与 Perl 兼容)

当使用 PREG_UNMATCHED_AS_NULL 模式时,尾随未匹配的捕获组现在也将被设置为 null(如果启用了偏移量捕获,则为 [null, -1])。这意味着 $matches 的大小将始终相同。

PHP 数据对象

尝试序列化 PDOPDOStatement 实例现在将生成一个 Exception 而不是 PDOException,与其他不支持序列化的内部类一致。

反射

如果尝试序列化反射对象,反射对象现在将生成一个异常。反射对象的序列化从未受支持,并且会导致反射对象损坏。现在它被明确禁止了。

ReflectionClassConstantReflectionMethodReflectionProperty 的类常量的值已更改。

标准 PHP 库 (SPL)

ArrayObject 实例上调用 get_object_vars() 现在将始终返回 ArrayObject 本身(或子类)的属性。以前它返回包装数组/对象的属性,除非指定了 ArrayObject::STD_PROP_LIST 标志。

其他受影响的操作是

(数组) 转换不受影响。它们将继续返回包装后的数组,或者 ArrayObject 属性,具体取决于是否使用 **ArrayObject::STD_PROP_LIST** 标志。

SplPriorityQueue::setExtractFlags() 如果传递了零,则会抛出异常。以前,这会在下一次提取操作时生成一个可恢复的致命错误。

ArrayObjectArrayIteratorSplDoublyLinkedListSplObjectStorage 现在除了支持 Serializable 接口外,还支持 __serialize()__unserialize() 机制。这意味着在旧版本的 PHP 上创建的序列化有效载荷仍然可以被反序列化,但 PHP 7.4 创建的新有效载荷将不被旧版本理解。

词法分析器

token_get_all() 现在将为意外字符发出 **T_BAD_CHARACTER** 令牌,而不是在令牌流中留下空洞。

传入的 Cookie

从 PHP 7.4.11 开始,出于安全原因,传入 Cookie 的 *名称* 将不再进行 URL 解码。

添加注释

用户贡献的注释 1 条注释

happydog at kennel17
3 年前
关于:“o 序列化格式已删除。由于它从未由 PHP 生成,因此这可能只会破坏手动制作的字符串的反序列化。”

这个小 o 序列化格式由 PHP3 使用,但从未由 PH PHP4 或更高版本生成。尽管如此,出于与 PHP3 的向后兼容性的原因,反序列化代码仍然识别它。

但是,根据一些调查,这个代码似乎已经坏了大约 15 年了,因此尽管这被列为弃用,但在实践中它并没有。

有关更多详细信息,请参阅此 Stack Overflow 问题,它提供了非常好的答案:https://stackoverflow.com/questions/65289729/what-was-phps-o-serialization-format-for
To Top