PHP 8.5 将带来什么 🚀

PHP 8.5 将带来什么 🚀

PHP 8.5 仍在开发中;首个正式版本计划于 2025 年 11 月 20 日发布。如果你想尝试,nightly tarballs 和 Docker 镜像(php:8.5.0-dev)已经可用。

新特性

领域 特性
语言语法 管道操作符 |>
标准库 array_first(), array_last(), 新的 IntlListFormatter, curl_multi_get_handles(), locale_is_right_to_left()
属性 #[\NoDiscard] + (void) 强制转换
核心调整 Directory 成为不透明/最终类
性能/IO 原生 Zstandard 和 Brotli 压缩

新的语言结构

管道操作符 |>

2025 年 2 月批准,管道将左侧值传递给右侧的可调用对象,并从左到右求值。


$result  =  "Hello World"
 |>  htmlentities(...)
 |>  str_split(...)
 |>  fn($x) => array_map(strtoupper(...), $x)
 |>  fn($x) => array_filter($x, fn ($v) => $v  !==  'O');

var_dump($result);  // ['H','E','L','L','W','R','D']

Records — 不可变值对象

record 关键字(RFC 正在讨论中,但趋势积极)让你可以用几乎零样板代码声明按值传递的不可变类型。

record  Point(int  $x, int  $y);
$origin  =  &Point(0, 0); // 前导的“&”表示记录实例化
echo  $origin->x;          // 0

构造函数属性提升中的 final

很快你就可以将提升的属性标记为 final,保证它们在构造后永不改变。投票已经压倒性地支持。

class  User
{
     public  function  __construct(
        final string  $id,
        public  string  $name,
    ) {}
}

常量表达式中的闭包

静态闭包现在可以在 const、属性参数和默认属性/参数值中使用 — 对于默认回调非常方便。已为 8.5 实现。

const  DEFAULT_FILTER  =  static  function (mixed  $v):  bool {
 return  !empty($v);
};

#[\NoDiscard] + (void) 强制转换

标记必须消耗其返回值的函数;如果你真的想忽略它,可以将调用强制转换为 (void) 以消除警告。

#[\NoDiscard('You probably meant to use this')]
function  compute():  array
{
 return [...];
}
(void) compute(); // 显式丢弃 – 无警告

标准库新增内容

✨ 新的 API 为什么你会关心
array_first() / array_last() 在 O(1) 时间内获取第一个或最后一个元素,而不触及内部指针。
curl_multi_get_handles() 枚举 multi-curl 资源中的所有句柄。
IntlListFormatter 支持 i18n 的人性化列表(例如“apples, pears and peaches”)。
locale_is_right_to_left() 无需 ICU 查找的快速 RTL 检查。
php --ini=diff CLI 标志,仅打印你调整过的 INI 条目。
PHP_BUILD_DATE 精确的构建时间戳嵌入到二进制文件中。
$items  = ['🍎','🍐','🍑'];
echo  array_first($items); // 🍎
echo  array_last($items);  // 🍑

引擎和核心库调整

Directory 现在是不透明的

你不能再 new Directory() 或克隆/序列化它;将其视为真正的资源对象。

$dir  =  dir('.');

clone  $dir;        // 致命错误

new  Directory(); // 致命错误

内置现代压缩

ZstandardBrotli 加入 zlib,为你提供快速、原生的 Web 压缩。

$zip  =  zstd_compress($data);

$plain  =  brotli_uncompress($zip);

弃用内容

所有 MHASH_* 常量都将被弃用。

随着 8.5 的稳定,预计会有一轮新的小边缘案例清理。

总结

PHP 8.5 不是一个革命性的版本,但它带来了大量的人体工程学改进:

  • 函数式管道,使数据流更清晰
  • 无样板代码的值对象
  • 更安全的 API,引导你远离陷阱
  • 以及许多小而强大的生活质量提升

引用

原文链接

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 18

管道符这个特性我很看好,但是

1天前 评论
JaguarJack (楼主) 1天前
还不出来 23小时前

没点卵用,还不如把真异步做了

1天前 评论

语法逐渐抽象

23小时前 评论

整这些花里胡哨的语法干啥

23小时前 评论
Jyunwaa

彻底没活儿了

22小时前 评论
JaguarJack (楼主) 22小时前

php不是成立了一个基金会吗,怎么没钱了

21小时前 评论
JaguarJack (楼主) 21小时前
无与伦比 (作者) 20小时前
JaguarJack (楼主) 18小时前
梦想星辰大海

没啥期待。

20小时前 评论
Epona

Elixir 大法好! (指 |>)

19小时前 评论

这个管道操作符看起来很丑陋

18小时前 评论

语法层面上的修改没有任何期待感。

16小时前 评论

不太对,也不太完整,

  • Pipe Operator V3 是在上个月底才投票通过的
  • Attribute 里面可以使用 First class callable 语法
  • 常量支持 Attribute
  • 静态匿名函数将可以用在常量表达式(方法默认参数、常量等)
  • cURL 句柄共享(可以减少 cURL 中的部分请求)
  • get_error_handler(), get_exception_handler() 方法
  • 致命错误添加回溯调用堆栈信息
13小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发 @ 家里蹲开发公司
文章
76
粉丝
73
喜欢
362
收藏
261
排名:19
访问:27.5 万
私信
所有博文
社区赞助商