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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 26

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

2周前 评论
JaguarJack (楼主) 2周前
还不出来 2周前
我们只希望世界和平 (作者) 2周前

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

2周前 评论
mowangjuanzi 1周前
syaoran (作者) 1周前

语法逐渐抽象

2周前 评论

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

2周前 评论
Jyunwaa

彻底没活儿了

2周前 评论
JaguarJack (楼主) 2周前

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

2周前 评论
JaguarJack (楼主) 2周前
无与伦比 (作者) 2周前
JaguarJack (楼主) 2周前
梦想星辰大海

没啥期待。

2周前 评论
Epona

Elixir 大法好! (指 |>)

2周前 评论

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

2周前 评论

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

2周前 评论

不太对,也不太完整,

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

语法抽象又进了一步,无关痛痒的改进。

2周前 评论

php需要的是像python asyncio那样的破坏性变革,最大的成本是以前的中间件全部要用异步重写才能发挥作用。python挺过来了,但生态几乎发生了颠覆。

1周前 评论

人体工学 :heart_eyes:

1周前 评论

这么个发展套路,一点意思都没

6天前 评论

管道符会导致代码很难很难很难阅读的,重要事情说三遍。

6天前 评论

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