下面我把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。
泛型之殇,本质是动态语言与静态类型的不可调和。