2024 年 PHP 日本会议

其他更改

核心更改

FFI

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

FPM

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

Opcache

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

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

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

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() 现在引发 ValueError 而不是 Exception,当 $constructor_args 参数非空且类没有构造函数时。

mysqli_poll() 现在在未传递 $read$error 参数时引发 ValueError

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

ODBC

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

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