FFI::load() 现在在预加载期间允许,前提是 opcache.preload_user 是当前系统用户。之前,如果设置了 opcache.preload_user 指令,则在预加载期间无法调用 FFI::load()。
如果套接字路径超过操作系统支持的长度,则 FPM CLI 测试现在将失败。
在 CLI 和 phpdbg SAPIs 中,预加载不再需要 opcache.preload_user 指令,只要以 root 身份运行。在其他 SAPIs 中,当以 root 身份运行时,此指令是必需的,因为预加载是在 SAPI 切换到非特权用户之前完成的。
阻塞 fread() 在套接字连接上,如果存在任何缓冲数据,则会立即返回,而不是等待更多数据。
内存流不再在 seek 偏移量超出末尾时失败。相反,内存将在下次写入时增加,旧末尾和偏移量之间的数据将填充零字节,类似于文件的工作方式。
stat() 访问操作(如 file_exists() 等)现在将使用实际路径而不是实际流路径。这与流打开一致。
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_getinfo() 现在支持两个新的常量:CURLINFO_CAPATH
和 CURLINFO_CAINFO
。如果选项为 null
,则以下两个附加键存在:"capath"
和 "cainfo"
。
已将 DOMCharacterData::appendData() 的暂定返回类型更改为 true。
DOMDocument::loadHTML()、DOMDocument::loadHTMLFile() 和 DOMDocument::loadXML() 现在具有 bool 的暂定返回类型。之前,这被记录为具有 DOMDocument|bool
的返回类型,但是,从 PHP 8.0.0 开始,DOMDocument 无法返回,因为它不再是静态可调用的。
imagerotate() 的签名已更改。已删除 $ignore_transparent
参数,因为它从 PHP 5.5.0 开始就被忽略。
datefmt_set_timezone()(及其别名 IntlDateformatter::setTimeZone())现在在成功时返回 true
,之前返回 null
。
IntlBreakiterator::setText() 现在在失败时返回 false
,之前返回 null
。它现在在成功时返回 true
,之前返回 null
。
IntlChar::enumCharNames() 现在返回一个布尔值。之前它在成功时返回 null
,在失败时返回 false
。
IntlDateFormatter::__construct() 在设置无效区域设置时会抛出 U_ILLEGAL_ARGUMENT_ERROR
异常。
mb_strtolower() 和 mb_convert_case() 为希腊字母 sigma 实现了条件大小写规则。对于 mb_convert_case(),条件大小写仅适用于 MB_CASE_LOWER
和 MB_CASE_TITLE
模式,不适用于 MB_CASE_LOWER_SIMPLE
和 MB_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_fetch_object() 现在在 $constructor_args
参数不为空且类没有构造函数的情况下,会引发 ValueError 而不是 Exception。
mysqli_poll() 现在在没有传递 $read
或 $error
参数的情况下,会引发 ValueError。
mysqli_field_seek() 和 mysqli_result::field_seek() 现在将返回值类型指定为 true 而不是 bool。
odbc_autocommit() 现在接受 $enable
参数的 null。传递 null 与只传递 1 个参数的行为相同,即表示是否启用了自动提交功能。
pg_fetch_object() 现在在 $constructor_args
参数不为空且类没有构造函数的情况下,会引发 ValueError 而不是 Exception。
pg_insert() 现在在指定的表无效的情况下,会引发 ValueError 而不是 E_WARNING。
pg_insert() 和 pg_convert() 在字段的值/类型与 PostgreSQL 类型不匹配时,会引发 ValueError 或 TypeError,而不是 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 生命周期机制已重新设计,以便仍然可以获取隐式删除的节点。之前,这会导致异常。
SQLite3 类现在会抛出 SQLite3Exception(继承自 Exception),而不是 Exception。
SQLite 错误代码现在会传递到异常错误代码中,而不是包含在错误消息中。
assert.*
INI 设置已被弃用。这包括以下 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 指令,用于设置以字节为单位的保留堆栈大小。在检查堆栈大小时,这将从允许的最大堆栈大小中减去,作为缓冲区。
遍历 DOMNodeList 现在使用缓存。因此,默认情况下,请求项目不再需要二次时间。
从节点获取文本内容现在避免了分配,从而提高了性能。
DOMChildNode::remove() 现在以 O(1) 性能运行。
file() 的标志错误检查现在快了大约 7%。
RecursiveDirectoryIterator 在遍历目录时现在执行更少的 I/O 操作。