PHP 8.5.0 Released!

新功能

PHP 核心

管道运算符

新增管道(|>)运算符

<?php
$result
= "Hello World" |> strlen(...);
print
$result . PHP_EOL; // Prints "11"

常量表达式中的闭包

在常量表达式中新增对闭包一级可调用对象的支持,包括:

  • 注解参数。
  • 属性和参数的默认值。
  • 常量和类常量。

#[\NoDiscard] 注解

新增了 NoDiscard 注解,用于表示函数的返回值是重要的,应当使用它。

同时,新增 (void) 转换以表明不使用某个值是故意的。(void) 转换本身对程序执行没有任何影响,但可以用来抑制 #[\NoDiscard] 发出的警告,也可能用于消除外部 IDE 或静态分析工具发出的诊断信息。

<?php

#[\NoDiscard]
function
concat(string $a, string $b): string {
return
a + b;
}

// concat() 的返回值应要么被使用,要么通过在 xxx.php 中将其强制转换为 (void) 来有意忽略。
concat("a", "b");

// 不会发出警告,因为返回值已被赋值操作使用。
$results = concat("a", "b");

// 不会发出警告,因为使用了 (void) 转换。
(void)concat("a", "b");

常量上的注解

新增对编译时非类常量的注解支持(例如,const MY_CONST = 1; 而非 define('MY_CONST', 1);)。

Deprecated 注解现在可以用于常量。

#[\DelayedTargetValidation] 注解

新增的 DelayedTargetValidation 注解可用于抑制在无效目标上使用核心(或扩展)注解时产生的编译时错误。这些错误会在调用 ReflectionAttribute::newInstance() 时于运行时报告(如果需要)。

用于属性的 #[\Override]

Override 注解现在可应用于属性。

静态非对称可见性

新增对静态属性的非对称可见性支持

Fatal Error 的 Backtraces

Fatal Error(例如超出最大执行时间)现在包含回溯信息。

final 属性的构造方法提升

构造方法属性提升现在可以用于最终属性。

常量表达式中的类型转换

新增对常量表达式中类型转换的支持。

<?php
const T1 = (int) 0.3; // 之前:“Fatal error: Constant expression contains invalid operations”
print T1 . PHP_EOL; // 打印“0”

Clone 函数

clone 语言结构现在是函数,并通过新的 $withProperties 参数支持在克隆期间重新分配(只读)属性。

cURL

新增对多个 PHP 请求之间持久化的共享句柄的支持,从而安全地实现更高效的连接复用。

curl_getinfo() 函数新增对 CURLINFO_USED_PROXY(libcurl >= 8.7.0)、CURLINFO_HTTPAUTH_USEDCURLINFO_PROXYAUTH_USED(libcurl >= 8.12.0)的支持。当 curl_getinfo() 返回数组时,相同的信息可通过 "used_proxy""httpauth_used""proxyauth_used" key 获取。如果上一次传输未使用代理,将设置 CURLINFO_USED_PROXY 为零;如果使用了代理,则为非零值。CURLINFO_HTTPAUTH_USEDCURLINFO_PROXYAUTH_USED 将返回位掩码,表示上一次请求中使用的 HTTP 和代理认证方法。有关可能的值,请参阅 CURLAUTH_* 常量。

新增 CURLOPT_INFILESIZE_LARGE Curl 选项,作为 CURLOPT_INFILESIZE 的安全替代。在某些系统上,即使是在 64 位系统中,CURLOPT_INFILESIZE 也仅接受 32 位有符号整数作为文件大小(2.0 GiB)。而 CURLOPT_INFILESIZE_LARGE 可接受系统能够处理的最大整数值。

curl_setopt()CURLOPT_FOLLOWLOCATION 选项新增了 CURLFOLLOW_OBEYCODECURLFOLLOW_FIRSTONLYCURLFOLLOW_ALL 值。CURLFOLLOW_OBEYCODE 在允许重定向的情况下,会更严格地遵循重定向规则。CURLFOLLOW_FIRSTONLY 仅跟随第一次重定向,因此如果有后续的重定向,则不会继续跟进。CURLFOLLOW_ALL 等同于将 CURLOPT_FOLLOWLOCATION 设置为 true。

curl_getinfo() 函数新增对 CURLINFO_CONN_ID(libcurl >= 8.2.0)的支持。该常量可用于获取 cURL 传输的连接唯一 ID。当需要在 PHP 层面实现连接复用或连接池逻辑时,该功能尤其有用。当 curl_getinfo() 返回数组时,该值可通过 "conn_id" key 获取。

curl_getinfo() 函数新增对 CURLINFO_QUEUE_TIME_T(libcurl >= 8.6.0)的支持。该常量可用于获取请求发送之前在 libcurl 的连接队列中等待的时间(以微秒为单位)。通过将 CURLINFO_QUEUE_TIME_T 传递给 curl_getinfo()option 参数,也可以获取该值。

新增对 CURLOPT_SSL_SIGNATURE_ALGORITHMS 的支持,用于指定 TLS 的签名算法。

DOM

新增 Dom\Element::$outerHTML

Dom\ParentNode 实现中新增了 $children 属性。

EXIF

新增对 OffsetTime* Exif 标签的支持。

新增对 HEIF/HEIC 的支持。

Filter

新增 FILTER_THROW_ON_FAILURE flag,可传递给过滤函数,并在验证失败时强制触发异常。此 flag 无法与 FILTER_NULL_ON_FAILURE 结合使用,尝试这样做将导致抛出 ValueError

Intl

新增与多种货币相关数字格式对应的类常量:NumberFormatter::CURRENCY_ISONumberFormatter::CURRENCY_PLURALNumberFormatter::CASH_CURRENCY, 和 NumberFormatter::CURRENCY_STANDARD

新增 Locale::addLikelySubtags()Locale::minimizeSubtags() 方法,用于处理指定 locale 的可能标签。

新增 IntlListFormatter 类,用于根据指定 locale 对项目列表进行格式化、排序和标点处理,支持 IntlListFormatter::TYPE_ANDIntlListFormatter::TYPE_ORIntlListFormatter::TYPE_UNITS 操作数,以及 IntlListFormatter::WIDTH_WIDEIntlListFormatter::WIDTH_SHORTIntlListFormatter::WIDTH_NARROW 宽度。该功能从 icu 67 版本开始支持。

PDO_Sqlite

新增类常量 Pdo\Sqlite::ATTR_BUSY_STATEMENT

新增类常量 Pdo\Sqlite::ATTR_EXPLAIN_STATEMENTPdo\Sqlite::EXPLAIN_MODE_PREPAREDPdo\Sqlite::EXPLAIN_MODE_EXPLAINPdo\Sqlite::EXPLAIN_MODE_EXPLAIN_QUERY_PLAN

新增 Pdo\Sqlite::ATTR_TRANSACTION_MODE 连接注解,可选值包括 Pdo\Sqlite::TRANSACTION_MODE_DEFERREDPdo\Sqlite::TRANSACTION_MODE_IMMEDIATEPdo\Sqlite::TRANSACTION_MODE_EXCLUSIVE,用于配置调用 beginTransaction() 时使用的事务模式。

Session

session_set_cookie_params()session_get_cookie_params()session_start() 现在通过 "partitioned" key 支持分区 cookie。

SOAP

枚举项现在会在 SoapClient::__getTypes() 中输出。

新增对 SOAP 1.2 Reason Text 的 xml:lang 属性的支持。

因此,SoapFault::__construct()SoapServer::fault() 的签名现在包含可选的 $lang 参数。该支持解决了与 .NET SOAP 客户端的兼容性问题。

标准

mail() 函数现在会返回实际的 sendmail 错误,并能检测 sendmail 进程是否意外终止。若发生此类情况,将发出警告并返回 false。此前会静默忽略这些错误。此变更仅影响 sendmail 的传输。

getimagesize() 现在支持 HEIF/HEIC 图像。

当加载 ext-libxml 扩展时,getimagesize() 现已支持 SVG 图像。同样,image_type_to_extension()image_type_to_mime_type() 现也处理 IMAGETYPE_SVG。

getimagesize() 返回的数组现在包含两个额外的条目:"width_unit""height_unit",用于表示尺寸所使用的单位。这些单位默认为 px。这两个单位不一定相同(例如,一个可能是 cm,另一个可能是 px)。

setcookie()setrawcookie() 现在支持 "partitioned" key。

URI

新增始终启用的 URI 扩展,可用于根据 RFC 3986 和 WHATWG URL 规范处理 URI 和 URL。

XSL

XSLTProcessor::getParameter()XSLTProcessor::setParameter()XSLTProcessor::removeParameter()$namespace 参数现已生效,不再视为空值。此功能仅在 $name 参数未使用 Clark 表示法且不是 QName 时有效,因为在这些情况下,命名空间分别取自命名空间的 href 或前缀。

Zlib

flock() 现已支持 zlib 流。此前,该函数始终无法执行任何锁定操作。

添加备注

用户贡献的备注

此页面尚无用户贡献的备注。
To Top