PHP 8.5 新特性与废弃项:Pipe 操作符、URI 扩展与升级前要改的写法
PHP 8.5 于 2025-11-20 发布。相关链接:
- 发布说明:
- 迁移指南:
- NEWS:
新语法与能力
Pipe 操作符 |>:从左到右链式调用 callable,把上一步的返回值传给下一步,替代嵌套调用。配合 first-class callable 使用:
$result = "Hello World" |> strtoupper(...) |> strrev(...);
URI 扩展(始终启用):按 RFC 3986 与 WHATWG URL 标准解析、规范化 URL,提供 Uri\Rfc3986\Uri 与 Uri\WhatWg\Url 两类 API(parse、normalize、resolve 等)。也可用于 FTP/FTPS 与 SSL/TLS stream wrapper 的解析器配置。
Clone with:clone 从语言结构变成函数,新增 $withProperties 参数,可在克隆时重写(readonly)属性,简化 readonly 类的 "with-er" 模式:
$new = clone $obj with ['prop' => 'x'];
文档写法见 release notes。
#[\NoDiscard] 属性:函数返回值未被使用时报 warning;配套新增 (void) 强转表示「有意不用」,可用于抑制该 warning 与静态分析诊断。
常量表达式:闭包与 first-class callable 现在可用于常量表达式,包括属性参数、属性/参数默认值、常量与类常量。
数组辅助函数:新增 array_first() / array_last(),空数组返回 null,便于配合 ?? 使用。
Closure::getCurrent():在匿名函数内取当前正在执行的闭包,简化递归写法。
属性与反射相关:常量可加属性;#[\Deprecated] 可用于 trait 与常量;#[\Override] 可用于属性;#[\DelayedTargetValidation] 可把无效目标的编译期报错延迟到 ReflectionAttribute::newInstance()。
可见性与提升:静态属性支持非对称可见性;构造器属性提升可以声明 final 属性。
致命错误带 backtrace:新增 fatal_error_backtraces 设置,8.5 默认值为 1,无需配置即生效,error_get_last() 会带 trace 键。
INI 排查:php --ini 新增 diff 选项,便于看出被改过的 INI 值。
Cookie:setcookie() / setrawcookie() 支持 "partitioned" 键(CHIPS);session_start() / session_set_cookie_params() 也可为 session cookie 开启分区。
cURL:curl_share_init_persistent() 创建的持久化 share handle 不随请求销毁,参数相同的可复用,省去反复初始化;新增 CURLOPT_INFILESIZE_LARGE 与 CURLFOLLOW_*(含 CURLFOLLOW_FIRSTONLY);curl_getinfo() 可拿连接 ID。
图像与其他扩展:getimagesize() 支持 HEIF/HEIC(依赖扩展)与 SVG(ext/libxml);新增 grapheme_levenshtein();Dom\Element 增加 getElementsByClassName() 与 insertAdjacentHTML()。
运行时与构建:Opcache 现在是 PHP 的非可选组成部分,始终编进二进制;TAILCALL VM 在用 Clang >= 19 编译 x86_64/aarch64 时默认启用;新增常量 PHP_BUILD_PROVIDER、PHP_BUILD_DATE。
版本节奏参考:8.5.9(2026-07-30)为最新安全版本,8.5 活跃支持到 2027-12-31,EOL 2029-12-31。
废弃与不兼容(升级前重点看)
以下写法在 8.5 中已废弃,升级时会触发 deprecation:
- 对非数字字符串做自增/自减。
- 用 null 作为数组下标,或把 null 传给
array_key_exists()。 - 反引号作为
shell_exec的别名。 - 非规范强转名
(boolean)、(integer)、(double)、(binary),改用(bool)等规范写法。 - 以分号而非冒号结束
case语句。 __debugInfo()返回 null。- 从查询字符串推导
$_SERVER['argc']/$_SERVER['argv']。
已移除与失效项:
disable_classesINI 已移除。get_defined_functions()的$exclude_disabled参数失效。
行为变更与新增告警:
- 用
[]/list()解构非数组(NULL 除外)会告警。 - 把无法表示成 int 的 float 强转成 int 会告警。
- 把 NAN 强转成其他类型会告警。
- 本地预定义变量
$http_response_header行为调整。 mail()现在会返回 sendmail 错误:sendmail 异常终止时告警并返回 false,以前是静默忽略。
升级前建议先跑一遍迁移指南里的检查项,重点是把废弃的强转名、case 结尾分号、null 下标这几类机械写法批量改掉,再确认 disable_classes 相关配置已从 INI 中清理。