PHP 大会日本 2024

其他更改

核心更改

闭包

闭包名称已调整为包含父函数的名称和定义行,以便于区分,例如在堆栈跟踪中。

纤程

现在允许在析构函数执行期间进行纤程切换。以前由于与垃圾回收发生冲突而被阻止。

析构函数现在可以在单独的纤程中执行

当在纤程中触发垃圾回收时,由 GC 调用的析构函数将在单独的纤程中执行:gc_destructor_fiber。如果此纤程挂起,则会创建一个新的纤程来执行剩余的析构函数。GC 不再引用以前的 gc_destructor_fiber,如果它在任何其他地方都没有被引用,则可以将其回收。其析构函数被挂起的对象将不会被回收,直到析构函数返回或Fiber被回收。

输出处理程序

传递给ob_start()flags参数的输出处理程序状态标志现在已清除。

output_add_rewrite_var()现在使用url_rewriter.hosts而不是session.trans_sid_hosts来选择将被重写的主机。

SAPI 模块中的更改

apache2handler

已删除对 EOL Apache 2.0 和 2.2 的支持。现在最低要求的 Apache 版本为 2.4。

CLI

如果无法找到指定的文件,则内置服务器会通过遍历父目录递归地查找索引文件。如果路径看起来像是引用文件(即,最后一个路径组件包含一个句点),则以前会跳过此过程。在这种情况下,将返回 404 错误。行为已更改为在所有情况下都查找索引文件。

FPM

现在,在没有正文的情况下刷新标头将成功。

状态页面有一个新字段用于显示内存峰值。

Solaris/Illumos 的/dev/poll events.mechanism设置已停用。

已更改的函数

核心

trigger_error()user_error()现在具有true的返回类型,而不是bool

DOM

DOMDocument::registerNodeClass()现在具有true的暂定返回类型,而不是bool。在实践中,它只能返回true

哈希

hash_update()现在具有true的暂定返回类型,而不是bool。在实践中,它只能返回true

Intl

NumberFormatter::ROUND_TOWARD_ZERONumberFormatter::ROUND_AWAY_FROM_ZERO已添加为NumberFormatter::ROUND_DOWNNumberFormatter::ROUND_UP的别名,以与新的PHP_ROUND_*模式保持一致。

ResourceBundle::get()现在具有ResourceBundle|array|string|int|null的暂定返回类型。

idn_to_ascii()idn_to_utf8()函数现在始终在domain名称为空或过长时抛出ValueError

idn_to_ascii()idn_to_utf8()函数现在始终在variant参数不是INTL_IDNA_VARIANT_UTS46时抛出ValueError

LibXML

libxml_set_streams_context()现在在将非流上下文资源传递给函数时立即抛出TypeError,而不是在以后使用流上下文时抛出。

MBString

现在,mb_strcut()在无效的 UTF-8 和 UTF-16 字符串上的行为更加一致。对于有效的 UTF-8 和 UTF-16 字符串,行为没有变化。

ODBC

odbc_fetch_object()odbc_fetch_array()odbc_fetch_into()row现在具有null的默认值,与odbc_fetch_row()一致。以前,默认值分别为-1-10

OpenSSL

openssl_csr_new()中的extra_attributes设置CSR属性而不是主题 DN,这在以前是错误的。

openssl_csr_new()中的dn允许为单个条目设置array值。

已将新的serial_hex添加到openssl_csr_sign(),以允许以十六进制格式设置序列号。

如果省略了秒数,则使用openssl_x509_parse()解析 ASN.1 UTCTime 会失败,对于 OpenSSL 3.2 以下的版本(此类字段返回-1)。OpenSSL 3.3 以上的版本已不再加载此类证书。

PDO

现在可以使用PDO::getAttribute()获取PDO::ATTR_STRINGIFY_FETCHES属性的值。

已添加新的PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE,用于使用PDO::getAttribute()检索查询结果的内存使用情况,适用于支持它的驱动程序。

PDO_FIREBIRD

现在可以使用PDO::getAttribute()获取FB_ATTR_DATE_FORMATFB_ATTR_TIME_FORMATFB_ATTR_TIMESTAMP_FORMAT属性的值。

添加了新的属性以指定事务隔离级别和访问模式。已添加五个与此功能相关的常量

使用持久连接时,构造函数中现在有一个活动检查。

根据ibase.hFB_API_VER的值构建的内容会发生变化。可以使用新的静态方法Pdo\Firebird::getApiVersion()获取此信息。此信息现在也已在phpinfo()中引用。

现在提供了五个新的数据类型:INT128DEC16DEC34TIMESTAMP_TZTIME_TZ。这些从 Firebird 4.0 开始可用。

PDO_MYSQL

现在可以通过 PDO::getAttribute() 获取属性 PDO::ATTR_FETCH_TABLE_NAMES 的值。

PDO_PGSQL

支持检索 **PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE** 查询的内存使用情况。

如果列的类型为 FLOAT4OIDFLOAT8OID,则现在将返回值为 float 而不是 string

PGSQL

pg_select()conditions 参数现在是可选的,并接受空数组。

Phar

Phar::setAlias(), Phar::setDefaultStub() 方法现在具有 true 的尝试返回值,而不是 bool

POSIX

posix_isatty() 现在在文件描述符/流参数无效时设置错误号。

Reflection

现在可以在生成器执行完成之后调用 ReflectionGenerator::getFunction()

Sockets

socket_create_listen()backlog 参数现在默认值为 SOMAXCONN。之前是 128

Sodium

sodium_crypto_aead_aes256gcm_()* 函数现在可以在具有 ARM 加密扩展的 aarch64 CPU 上使用。

Standard

password_hash() 函数中,用于 PASSWORD_BCRYPT 哈希算法的默认 'cost' 值已从 10 增加到 12

debug_zval_dump() 现在指示数组是否已打包。

long2ip() 现在返回值类型为 string,而不是 string|false

highlight_string() 现在返回值类型为 string|true,而不是 string|bool

print_r() 现在返回值类型为 string|true,而不是 string|bool

使用 round() 进行舍入

round() 函数的 mode 参数已扩展为 RoundingMode|int,接受新 RoundingMode 枚举的实例。

round() 函数添加了四种新模式:RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero

已重写舍入到整数的内部实现,使其更易于验证正确性并更易于维护。由于重写,一些舍入错误已修复。例如,以前将 0.49999999999999994 舍入到最接近的整数将导致 1.0,而不是正确的结果 0.0。其他输入也可能受到影响,并导致与早期 PHP 版本不同的输出。

修复了由 round() 函数的“预舍入”导致的错误。以前,使用“预舍入”将值如 0.285(实际上为 0.28499999999999998)视为十进制数并将其舍入为 0.29。但是,“预舍入”会错误地舍入某些数字,因此此修复删除了“预舍入”并更改了数字的比较方式,以便正确地将值舍入为十进制数。

round() 可以处理的最大精度已扩展一位。例如,round(4503599627370495.5) 以前返回 4503599627370495.5,但现在返回 4503599627370496

扩展的其他更改

cURL

现在所需的最低 libcurl 版本为 7.61.0。

CURLOPT_DNS_USE_GLOBAL_CACHE 选项不再有任何作用,并且会被静默忽略。此底层功能在 libcurl 7.11.1 中已弃用,并在 libcurl 7.62.0 中删除。

GMP

现在可以将 GMP 对象转换为 bool,而不是发出 E_RECOVERABLE_ERROR。转换行为被重载,以便表示值为 0GMP 对象转换为 false

LibXML

现在所需的最低 libxml2 版本为 2.9.4。

Intl

Intl 类的行为已标准化为在尝试使用未初始化的对象或克隆失败时始终抛出 Error 异常。

MBString

Unicode 数据表已更新至 Unicode 16.0。

MySQLnd

支持 MySQL 9 中新的 VECTOR 数据类型。

OpenSSL

现在所需的最低 OpenSSL 版本为 1.1.1。

PDO_PGSQL

现在所需的最低 libpq 版本为 10.0。

PGSQL

现在所需的最低 libpq 版本为 10.0。

SPL

现在,SplFixedArray 中的越界访问将抛出类型为 OutOfBoundsException 的异常,而不是 RuntimeException。因为 OutOfBoundsExceptionRuntimeException 的子类,所以在尝试捕获这些异常时不会出现行为变化。

XSL

现在声明了类型属性 XSLTProcessor::$cloneDocumentXSLTProcessor::$doXInclude

Zlib

现在所需的最低 zlib 版本为 1.2.11。

性能

核心

提高了在高并发负载下 ZTS 构建中浮点数解析和格式化的性能。这会影响 printf() 函数族以及 json_encode()serialize() 等序列化函数。

仅使用 %s%d 说明符的 sprintf() 将被编译成等效的字符串插值,避免函数调用的开销并重复解析格式字符串。

BCMath

改进了数字转换和运算的性能。

DOM

对于没有 xpath 查询的情况,DOMNode::C14N() 的性能得到了极大的提升。对于包含数万个节点的文档,这可以轻松地提高两个数量级的速度。

提高了 XML 序列化的性能并减少了内存消耗。

减少了节点类的内存使用量。

FTP

对于大型上传,FTP 上传的性能提高了高达 10 倍。

哈希

添加了 SHA-256 的 SSE2 和 SHA-NI 实现。这在支持的 CPU 上将性能提高了约 1.3 倍 (SSE2) 和 3 倍 - 5 倍 (SHA-NI)。感谢 Colin Percival / Tarsnap 提供此优化。

MBString

mb_strcut() 现在对于 UTF-8 和 UTF-16 字符串的速度快得多。

现在查找 mbstring 编码名称的速度快得多。

SJIS-win 到 Unicode 的转换性能得到了极大的提升。

MySQLnd

提高了 MySQLnd 引号的性能。

PCRE

提高了命名捕获组的性能。

Random

提高了 Random\Randomizer 的性能,特别关注 Random\Randomizer::getBytes()Random\Randomizer::getBytesFromString() 方法。

SimpleXML

提高了 XML 序列化的性能并减少了内存消耗。

Standard

strspn()strcspn() 的性能得到了极大的提升。它们现在以线性时间运行,而不是受二次时间的限制。

提高了 strpbrk() 的性能。

get_browser() 现在速度快得多,某些测试用例的速度提高了 1.5 倍 - 2.5 倍。

添加注释

用户贡献的注释

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