这次更新带来了一堆看得见摸得着的改动:新加了 URI 扩展、引入了管道操作符和 clone-with 语法、加入了 #[NoDiscard] 属性,另外还有性能层面的优化、语法上更顺手的改动,以及社区投票出来的新发布页样式。这些东西都已经放在官方发布页上,感兴趣的人可以直接去翻文档看看。

发布页换了新界面这事儿挺有意思,是社区投票选出来的样式,开发者 @有鲫雪狐 在发布说明里也专门提到这点。媒体那边传播也快,Linuxiac 在 11 月 20 日发过一篇介绍,国内的 IT之家 在 11 月 22 日跟着转载并补充了内容,所以消息扩散得挺快的。算是一次技术改善和社区参与一起发生的更新,不只是内部悄悄改了点东西。
说点实用的细节。新加的内置 URI 扩展是这次比较重的变动之一。它底层用了 uriparser 和 Lexbor 两个库,给出一套统一的 API,能解析和修改 URL,而且同时兼容 RFC 3986 和 WHATWG 的 URL 规范。换句话说,遇到一些复杂的 URL 或者跨两套标准的场景,老的 parse_url 有时候会掉链子,这个扩展能更稳妥一些。要不要立刻替换旧函数,要看你项目里 URL 的复杂程度,但如果对规范严格,优先思考新扩展比较靠谱。

语法糖方面两样挺好用。管道操作符 |> 让函数调用看起来像流水线,一个值从左往右流过去,省掉层层嵌套,代码读起来更平直。另一个是 clone-with,写法像 clone($obj, ['prop' => value]),可以在克隆对象时直接修改指定字段。要做那种“复制后改一个字段”的套路,尤其在只读类里,这个语法省了不少模板代码和手工复制的麻烦。用习惯了,你会觉得代码像从乱麻变成直线一样舒服。
防止忘记处理重大返回值这个问题也有对应变化:新增 #[NoDiscard] 属性。如果一个函数标了这个属性,但调用者没用返回值,运行时会报个警告。的确 有时候我们会不小心忽略返回值,等到问题出现才发现。明确想丢弃的时候可以用 (void) 来表明这是有意为之,警告就能消除。这个机制既是提醒也带点运行时保护,能减少由于疏忽导致的逻辑错误。

性能方向也做了几处实用调整。持久化的 cURL 共享句柄被引入后,对于长时间运行的服务来说,多个请求之间可以复用一些连接数据,降低常驻开销。换句话说,做外部请求多的 daemon 或者微服务,这一块能明显省资源;对那种短命脚本,提升就不明显了。还有两个小但常用的函数 array_first 和 array_last,直接返回数组首尾元素,省去自己写判断或重复逻辑。另外,致命错误目前会带上回溯跟踪,这对排查线上崩溃很有协助,能把更多上下文信息拿出来看。
兼容性和迁移上的事不能忽视。带 #[NoDiscard] 的函数可能会导致编译期或运行期出现警告,这要求团队过一遍代码,判断哪些返回值真能忽略,哪些不能。管道操作符和 clone-with 会改变代码的写法和阅读习惯,代码审查时可能需要约定风格,避免混乱。持久化 cURL 共享句柄对短脚本作用不大,所以不要盲目改所有场景。array_first/array_last 用起来方便,但要留心空数组的返回是怎样的,跟现有逻辑是否冲突,别改着改着把边界情况弄掉了。

这一版的许多特性是通过 RFC 提案推进的,社区在讨论阶段把细节磨了好几轮,所以既有语法糖也有底层工具的增强,目标都指向让开发更高效、代码更容易读、运行更稳。文档里每项新特性都有例子和兼容性说明,想上手的话按项目需求逐条看,先在试验环境里验证行为,再分阶段在生产里启用。


