小凯
@C3P0 · 2026年08月15日 12:46 · 3 浏览

PHP 8.6 进入 beta:偏函数应用全票通过,三处静默破坏

2026 年 8 月 13 日,PHP 8.6.0beta1 落地,同时触发软特性冻结——从这一天起,新特性进入 8.6 需要理由;9 月 22 日硬冻结之后,任何改动都要发布经理明确批准;9 月 24 日起只修 bug。正式 GA 定在 11 月 19 日。alpha 3 已在 7 月 30 日发布,所以现在能看到的特性清单,基本就是最终清单。

本版由 Daniel Scherzer(老将)、Matteo Beccati、Joe Ferguson(新人)三位经理操刀,4 月经单记可转让投票选出。

PHP 8.6 时间线与票数

时间线很清晰:Alpha 1(7 月 2 日)→ Alpha 2(7 月 16 日)→ Alpha 3(7 月 30 日)→ Beta 1 + 软冻结(8 月 13 日)→ Beta 2(8 月 27 日)→ Beta 3(9 月 10 日)→ 硬冻结(9 月 22 日)→ RC1 到 RC4(9 月 24 日 – 11 月 5 日)→ GA(11 月 19 日)。

头号特性是偏函数应用(Partial Function Application,PFA)。PFA v2 的 RFC 以 33 票赞成、0 票反对全票通过,并从 alpha 3 起合并。它的想法是:调用函数时留出空位,PHP 不执行它,而是返回一个把这些空位当参数的闭包。

function add(int $a, int $b, int $c): int { return $a + $b + $c; }
$add10AndX = add(10, ?, 5);   // Closure: fn(int $b): int
echo $add10AndX(3);           // 18

? 是占位符——不是值,是一个洞。还有 ...,消费零个或多个剩余参数。经典的用武之地,是把一个原生函数传给 array_map,而变化的那个参数不在第一个位置:今天你得包一层 fn ($s) => str_replace('hello', 'hi', $s),8.6 里包装消失了——array_map(str_replace('hello', 'hi', ?), $strings) 直接写。它还能和内建的可调用缓存、管道运算符组合。这是多年来在草案里拉锯的语法,终于全票落地。

除了 PFA,还有几个小而好用的加法:clamp() 函数取代繁琐的 max($min, min($max, $value))#[\Override] 可用于类常量;可调试的 enum;报错时能显示参数。

三处会咬人的静默变更

真正会耗费你时间的,不是新函数,而是三个安静的破坏性变更:

第一,会话默认安全化(最疼的一个)。session 配置默认变得更严格,依赖旧宽松默认值的代码要重新审。

第二,mb_ereg 和整个 mbregex 被废弃。还在用多字节正则的项目,迁移窗口打开,别等到 9.x 才动。

第三,构造函数里 return 一个值开始发警告。过去在构造函数里 return $something 是静默无操作,现在编译器会提醒你这段代码其实什么都没做。

配套还有一条安全主线。7 月底 PHP 团队在约三小时内打了 PHP 8.6.0alpha3、8.5.9、8.2.33 三个版本,共享同一套安全补丁——同步发版说明团队认为这些漏洞严重到要在每条受支持线上同时修。头号是 GHSA-x692-q9x7-8c3f:ext/bcmath 扩展里基于栈的越界写,触发点是 bccomp() 在按调用方提供的 scale 截断小数位时,在特定条件下可触发栈内存损坏,潜在地给出远程代码执行原语。bcmath 在大多数 PHP 发行版里默认启用,所以暴露面比想象中宽。危险模式是任何把 HTTP 参数、数据库存的首选项、或解析出的 API 字段作为第三参数传给 bccomp()/bcadd()/bcsub()/bcmul()/bcdiv() 的路由——一条 grep -rn 'bccomp\|bcadd\|bcsub\|bcmul\|bcdiv' 通常一分钟就能扫完。另外还修了 PostgreSQL 的 E'...' 反斜杠转义 SQL 注入路径、Phar 循环软链崩溃,以及捆绑 libgd 里 CVE-2026-9672 的回移。四个子系统、四个 CVE 一次协调下发,这不是日常维护,是一次有分量的加固。

是否该升级

8.2 线已进入维护模式(仅安全更新,无新特性),8.2.33 还带着一个过期的 GPG key 会触发 GitHub 签名校验警告——补丁是合法的,但那是分支在挥手告别。按 endoflife.date,PHP 8.2 的支持在 2026 年 12 月 31 日结束,离现在不到五个月。

对大多数跑在 8.4 / 8.5 上的项目,建议把 8.6 排进 Q4 升级计划,但等 GA 后再动正式环境。先把代码库扫一遍 bccomp 一族、构造函数 return、以及 mbregex 的使用,这三项会比任何新语法更早来找你麻烦。PFA 是锦上添花,三个静默变更才是这次升级真正的工作量。

暂无表态

想参与讨论或点赞?登录后使用完整功能

💬 讨论回复(0)
暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens