PHP 泛型之殇 泛型 RFC 提案被拒绝

下面我把PHP 泛型之殇:泛型 RFC 提案被拒绝整理成一篇完整、通俗、技术准确的文章,直接可用(偏技术评论风格,约 1200 字)。

PHP 泛型之殇:十年等待,最新擦除式泛型 RFC 再次被拒绝

2026 年 5 月,PHP 社区期待已久的Bound‑Erased Generic Types(擦除式泛型)RFC投票结束,结果4 票赞成、12 票反对、3 票弃权,提案正式被否决。这意味着:PHP 在可预见的未来,不会内置原生泛型

对 PHPer 而言,这不是第一次失望。从 2016 年首个正式泛型 RFC 算起,整整十年,泛型始终无法进入 PHP 内核PHP。

一、PHP 不是没有泛型,而是 “注释里的泛型”

PHP 是动态类型语言,天生缺乏编译期类型检查。为了解决类型安全、IDE 提示、静态分析等需求,社区很早就发明了一套PHPDoc 泛型语法

php

运行

/**@templateT */classCollection{/**@varT[]*/private$items;/**@paramT$item*/publicfunctionadd($item){}}

这套 “注释泛型” 已经存在多年,PHPStan、Psalm、IDE 都支持它。但它有致命问题:

写在注释里,PHP 引擎完全不识别、不校验、不报错PHP

重构容易过时、写错、漏写

Reflection 拿不到泛型信息PHP

不同工具解析规则不一致PHP

社区把这种状态戏称为:泛型在注释里,不在语言里

二、这次被拒的 RFC:最温和、零成本的 “擦除式泛型”

2026 年 RFC 的核心诉求非常保守,甚至可以说是 “妥协版泛型”:

只加语法,不加运行时检查

支持class Collection<T>、function foo<T>(T $x)写法

引擎完全擦除泛型信息,运行时和现在一模一样

类型检查全部交给 PHPStan/Psalm/IDE

简单说:把注释里的泛型,搬到代码里,引擎视而不见。优点非常明确:

零性能损耗

无 BC 破坏

不用改内核类型系统

统一语法,消除注释不一致问题

即便如此,依然被12:4 否决

三、为什么核心团队坚决不要泛型?

1. PHP 的动态基因:内核做泛型太难、太贵

PHP 所有类型检查都在运行时,没有编译期。要支持真正的泛型(reified),意味着:

内核要支持泛型类 / 函数模板展开

每一种Collection<int>、Collection<string>都要生成独立结构

内存暴涨、性能暴跌

PHP 创始人 Zeev、前核心开发 Nikita 多次明确:PHP 内核无法高效实现完整泛型,成本不可接受

2. 擦除式泛型被认为 “不伦不类”

反对意见集中在:

语法有了,运行时没有,这不是真正的weibo.com/ttarticle/p/show?id=2309405311601573494845泛型,只是语法糖”

会让开发者误以为有类型安全,实际依然弱类型

增加语言复杂度,却不解决运行时问题

Symfony 核心维护者 Nicolas Grekas 的观点代表了很多核心成员:

PHP 静态分析应该交给外部工具(PHPStan/Psalm),而不是把静态分析逻辑塞进内核。

3. 保持语言简洁:PHP 拒绝 “复杂化”

PHP 的设计哲学长期坚持:简单、实用、不炫技

核心团队担心:一旦加入泛型,后续必然要求:

泛型约束

协变 / 逆变

泛型方法

泛型接口

运行时反射泛型

一步步把 PHP 变成 “像 Java 一样复杂” 的语言 ——这是核心团队极力避免的PHP。

四、十年泛型路:历次 RFC 全失败

2016 年:Generic Types and Functions(完整泛型)

目标:运行时保留类型、强检查 → 复杂度太高,一直 Draft,从未投票PHP。

2024 年:Generic Arrays(泛型数组)

目标:给array<int>语法 → 被认为 “不完整、容易误导”,未通过PHP。

2026 年:Bound‑Erased Generic Types(擦除式泛型)

目标:语法泛型、运行时擦除 →4:12 被拒

结论:无论激进版还是妥协版,泛型在 PHP 内核始终无法达成共识

五、PHPer 该怎么办?现实方案

虽然没有原生泛型,但你依然可以获得接近泛型的开发体验

重度使用 PHPDoc 泛型

php

运行

/**@templateT of object */classRepository{/**@returnT*/publicfunctionget(int$id){}}

强制开启 PHPStan/Psalm 最高级别检查

相当于把泛型检查 “外包” 给静态分析工具。

使用集合类库

如doctrine/collections,配合 PHPDoc 实现类型安全。

接受现实:PHP 是动态语言,不要强行 Java 化

六、结语:PHP 的选择 —— 牺牲类型安全,换取简单与速度

这次擦除式泛型 RFC 被拒,基本宣告 PHP 原生泛型的死刑

对 PHP 来说,这是一种清醒:

不强行模仿静态语言

不牺牲性能换类型安全

不把语言搞复杂

代价也很明确:PHPer 永远要在注释里写泛型,依赖外部工具做类型检查PHP。

泛型之殇,本质是动态语言与静态类型的不可调和

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容