编程 PHP 8.5 新特性与废弃项:Pipe 操作符、URI 扩展与升级前要改的写法

2026-09-15 21:02:10

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\UriUri\WhatWg\Url 两类 API(parse、normalize、resolve 等)。也可用于 FTP/FTPS 与 SSL/TLS stream wrapper 的解析器配置。

Clone withclone 从语言结构变成函数,新增 $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 值。

Cookiesetcookie() / setrawcookie() 支持 "partitioned" 键(CHIPS);session_start() / session_set_cookie_params() 也可为 session cookie 开启分区。

cURLcurl_share_init_persistent() 创建的持久化 share handle 不随请求销毁,参数相同的可复用,省去反复初始化;新增 CURLOPT_INFILESIZE_LARGECURLFOLLOW_*(含 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_PROVIDERPHP_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_classes INI 已移除。
  • get_defined_functions()$exclude_disabled 参数失效。

行为变更与新增告警:

  • [] / list() 解构非数组(NULL 除外)会告警。
  • 把无法表示成 int 的 float 强转成 int 会告警。
  • 把 NAN 强转成其他类型会告警。
  • 本地预定义变量 $http_response_header 行为调整。
  • mail() 现在会返回 sendmail 错误:sendmail 异常终止时告警并返回 false,以前是静默忽略。

升级前建议先跑一遍迁移指南里的检查项,重点是把废弃的强转名、case 结尾分号、null 下标这几类机械写法批量改掉,再确认 disable_classes 相关配置已从 INI 中清理。

复制全文 生成海报 PHP PHP8.5 版本升级 废弃特性

推荐文章

程序员茄子在线接单