其他变更

核心变更

FFI

FFI::load() 现在在预加载期间允许,前提是 opcache.preload_user 是当前系统用户。之前,如果设置了 opcache.preload_user 指令,则在预加载期间无法调用 FFI::load()

FPM

如果套接字路径超过操作系统支持的长度,则 FPM CLI 测试现在将失败。

Opcache

在 CLI 和 phpdbg SAPIs 中,预加载不再需要 opcache.preload_user 指令,只要以 root 身份运行。在其他 SAPIs 中,当以 root 身份运行时,此指令是必需的,因为预加载是在 SAPI 切换到非特权用户之前完成的。

阻塞 fread() 在套接字连接上,如果存在任何缓冲数据,则会立即返回,而不是等待更多数据。

内存流不再在 seek 偏移量超出末尾时失败。相反,内存将在下次写入时增加,旧末尾和偏移量之间的数据将填充零字节,类似于文件的工作方式。

stat() 访问操作(如 file_exists() 等)现在将使用实际路径而不是实际流路径。这与流打开一致。

SAPI 模块的变更

CLI

STDOUTSTDERRSTDIN 流在资源销毁时不再关闭,这主要是在 CLI 完成时。但是,仍然可以使用 fclose() 等显式关闭这些流。

已更改的函数

核心

gc_status() 已添加以下 8 个字段

  • "running" => bool
  • "protected" => bool
  • "full" => bool
  • "buffer_size" => int
  • "application_time" => float: 总应用程序时间(以秒为单位)(包括 collector_time)
  • "collector_time" => float: 在收集循环中花费的时间(以秒为单位)(包括 destructor_time 和 free_time)
  • "destructor_time" => float: 在循环收集期间执行析构函数所花费的时间(以秒为单位)
  • "free_time" => float: 在循环收集期间释放值所花费的时间(以秒为单位)

class_alias() 现在支持创建内部类的别名。

使用 ini_set('open_basedir', ...); 在运行时设置 open_basedir 不再接受包含父目录 (..) 的路径。之前,只不允许以 .. 开头的路径。这可以通过在路径之前添加 ./ 来轻松解决。

用户异常处理程序现在会在关闭期间捕获异常。

highlight_string()highlight_file() 的结果 HTML 已更改。外部 HTML 标签之间的空白将被删除。换行符和空格不再转换为 HTML 实体。整个 HTML 现在都包含在一个 <pre> 标签中。外部 <span> 标签已与 <code> 标签合并。

日历

easter_date() 现在支持 64 位系统上的 1970 年到 2,000,000,000 年,之前它只支持 1970 年到 2037 年之间的年份。

Curl

curl_getinfo() 现在支持两个新的常量:CURLINFO_CAPATHCURLINFO_CAINFO。如果选项为 null,则以下两个附加键存在:"capath""cainfo"

DOM

已将 DOMCharacterData::appendData() 的暂定返回类型更改为 true

DOMDocument::loadHTML()DOMDocument::loadHTMLFile()DOMDocument::loadXML() 现在具有 bool 的暂定返回类型。之前,这被记录为具有 DOMDocument|bool 的返回类型,但是,从 PHP 8.0.0 开始,DOMDocument 无法返回,因为它不再是静态可调用的。

Gd

imagerotate() 的签名已更改。已删除 $ignore_transparent 参数,因为它从 PHP 5.5.0 开始就被忽略。

Intl

datefmt_set_timezone()(及其别名 IntlDateformatter::setTimeZone())现在在成功时返回 true,之前返回 null

IntlBreakiterator::setText() 现在在失败时返回 false,之前返回 null。它现在在成功时返回 true,之前返回 null

IntlChar::enumCharNames() 现在返回一个布尔值。之前它在成功时返回 null,在失败时返回 false

IntlDateFormatter::__construct() 在设置无效区域设置时会抛出 U_ILLEGAL_ARGUMENT_ERROR 异常。

MBString

mb_strtolower()mb_convert_case() 为希腊字母 sigma 实现了条件大小写规则。对于 mb_convert_case(),条件大小写仅适用于 MB_CASE_LOWERMB_CASE_TITLE 模式,不适用于 MB_CASE_LOWER_SIMPLEMB_CASE_TITLE_SIMPLE

mb_decode_mimeheader() 按 RFC 2047 的要求解释 QPrint 编码的 MIME 编码词中的下划线;它们被转换为空格。下划线必须在此类 MIME 编码词中编码为 "=5F"

在极少数情况下,mb_encode_mimeheader() 会对它的输入字符串进行传输编码,而它在 PHP 8.2 中会将其作为原始 ASCII 传递。

mb_encode_mimeheader() 在对输入字符串进行 QPrint 编码时不再丢弃 NUL(零)字节。这之前会导致某些文本编码(尤其是 UTF-16 和 UTF-32)中的字符串因 mb_encode_mimeheader 而损坏。

mb_detect_encoding() 的“非严格”模式现在按文档中所述的方式执行。之前,如果输入字符串的相同字节(例如,第一个字节)在所有候选编码中都是无效的,它将返回 false。更一般地说,它将在看到无效字节时从考虑范围中排除候选编码,如果相同的输入字节从考虑范围中排除所有剩余的编码,它将返回 false。另一方面,如果所有候选编码中除一个之外都被从考虑范围内排除,它将返回最后一个剩余的编码,而不管稍后在字符串中可能遇到多少编码错误。这与文档中所述的行为不同,文档中说:“如果将 strict 设置为 false,将返回最匹配的编码。”

mysqli

mysqli_fetch_object() 现在在 $constructor_args 参数不为空且类没有构造函数的情况下,会引发 ValueError 而不是 Exception

mysqli_poll() 现在在没有传递 $read$error 参数的情况下,会引发 ValueError

mysqli_field_seek()mysqli_result::field_seek() 现在将返回值类型指定为 true 而不是 bool

ODBC

odbc_autocommit() 现在接受 $enable 参数的 null。传递 null 与只传递 1 个参数的行为相同,即表示是否启用了自动提交功能。

PGSQL

pg_fetch_object() 现在在 $constructor_args 参数不为空且类没有构造函数的情况下,会引发 ValueError 而不是 Exception

pg_insert() 现在在指定的表无效的情况下,会引发 ValueError 而不是 E_WARNING

pg_insert()pg_convert() 在字段的值/类型与 PostgreSQL 类型不匹配时,会引发 ValueErrorTypeError,而不是 E_WARNING

pg_fetch_result()pg_field_prtlen()pg_field_is_null()$row 参数现在可以为空。

随机数

mt_srand()srand() 现在不再检查参数数量来确定是否应该使用随机种子。传递 null 会生成随机种子,0 会使用零作为种子。这些函数现在与 Random\Engine\Mt19937::__construct() 保持一致。

反射

ReflectionClass::getStaticProperties() 的返回值类型不再可以为空。

标准库

unserialize() 发出的 E_NOTICE 已提升为 E_WARNING

unserialize() 现在如果输入包含未消耗的字节,则会发出新的 E_WARNING

array_pad() 现在只受数组所能容纳的最大元素数量的限制。之前,每次最多只能添加 1048576 个元素。

strtok() 在开始标记化时没有提供标记的情况下,会引发 E_WARNING

password_hash() 现在在盐生成失败时,会将底层的 Random\RandomException 链接为 ValueError$previous Exception

如果将数组用作 proc_open()$command,它现在必须至少包含一个非空元素。否则将抛出 ValueError

proc_open() 如果 $command 数组是无效的命令,则返回 false,而不是资源对象,后者会在稍后产生警告。这在 Windows 中已经存在,现在在使用 posix_spawn 实现(大多数 Linux、BSD 和 MacOS 平台)的情况下也是如此。在某些旧平台上,此行为没有改变,因为 posix_spawn 在那里不受支持。

array_sum()array_product() 现在在数组中的值无法转换为 int/float 时发出警告。之前,数组和对象被忽略,而其他所有值都被转换为 int。此外,现在会将定义了数字强制转换的 (例如 GMP) 对象进行强制转换,而不是忽略。

number_format()$decimals 现在可以正确处理负整数。使用负数的 $decimals 进行舍入意味着 $num 在小数点前会被舍入到 $decimals 个有效数字。之前,负数的 $decimals 被静默地忽略,数字被舍入到小数点后零位。

已向 strrchr() 添加了一个新的 $before_needle 参数。它的行为类似于 strstr()stristr() 函数中的对应参数。

str_getcsv()fgetcsv() 现在返回一个空字符串,而不是一个包含单个空字节的字符串,用于仅包含未终止的引号的最后一个字段。

扩展的其他更改

核心

对类型为 bool 的值使用 递增/递减 运算符 (++/--) 现在会发出警告。这是因为目前它没有任何效果,但在将来会像 $bool += 1 一样工作。

对类型为 null 的值使用 递减 运算符 (--) 现在会发出警告。这是因为目前它没有任何效果,但在将来会像 $null -= 1 一样工作。

实现 _IS_NUMBER 强制转换但没有覆盖加法和减法的 do_operator 处理程序的内部对象现在可以递增和递减,就像使用 $o += 1$o -= 1 一样。

DOM

DOM 生命周期机制已重新设计,以便仍然可以获取隐式删除的节点。之前,这会导致异常。

SQLite3

SQLite3 类现在会抛出 SQLite3Exception(继承自 Exception),而不是 Exception

SQLite 错误代码现在会传递到异常错误代码中,而不是包含在错误消息中。

INI 文件处理的更改

  • assert.* INI 设置已被弃用。这包括以下 INI 设置

    如果设置的值等于默认值,则不会发出弃用通知。应该使用 zend.assertions INI 设置。

  • zend.max_allowed_stack_size 是一个新的 INI 指令,用于设置允许的最大堆栈大小。可能的值为 0(检测进程或线程的最大堆栈大小)、-1(无限制)或一个正数字节。默认值为 0。如果无法检测进程或线程的最大堆栈大小,则使用已知的系统默认值。将此值设置得太高与禁用堆栈大小限制的效果相同。协程使用 fiber.stack_size 作为允许的最大堆栈大小。当进程调用堆栈超过 zend.max_allowed_stack_size-zend.reserved_stack_size 字节时,会抛出 Error,以防止堆栈溢出引起的段错误,目标是使调试更容易。堆栈大小在涉及内部函数或魔术方法 __toString()__clone()__sleep()__destruct() 的不受控制的递归中会增加。这与堆栈缓冲区溢出无关,也不是安全特性。

  • zend.reserved_stack_size 是一个新的 INI 指令,用于设置以字节为单位的保留堆栈大小。在检查堆栈大小时,这将从允许的最大堆栈大小中减去,作为缓冲区。

性能

DOM

遍历 DOMNodeList 现在使用缓存。因此,默认情况下,请求项目不再需要二次时间。

从节点获取文本内容现在避免了分配,从而提高了性能。

DOMChildNode::remove() 现在以 O(1) 性能运行。

标准库

file() 的标志错误检查现在快了大约 7%。

SPL

RecursiveDirectoryIterator 在遍历目录时现在执行更少的 I/O 操作。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top