用途
本技能用于编写现代非框架 PHP 8.1–8.5 代码,聚焦于 LLM 经常写错或仍以 8.0 之前风格书写的语言特性。其首要目标是防止最常见的错误:使用 docblock 注解(如 @Route、@ORM\Column)而不是原生 #[Attribute] 语法。
本技能不适用于代码风格、PSR 合规或自动加载——这些属于 php-standards。也不适用于 Laravel 专有语法约定——那属于 Laravel 插件。
主要能力
技能覆盖的现代 PHP 语言特性包括:
- 枚举(Enums,含 backed 枚举、方法、接口):自 8.1 起,用于带行为的封闭值集合。
- 一等可调用语法 f(...):自 8.1 起,无需字符串即可传递可调用对象。
- readonly 属性 / 类:自 8.1 / 8.2 起,用于不可变值对象 / DTO。
- #[\Override]:自 8.3 起,在继承关系损坏时快速失败。
- 属性钩子 get/set:自 8.4 起,用于计算 / 校验属性,免去 getter/setter 样板代码。
- 非对称可见性 public private(set):自 8.4 起(静态版本自 8.5 起),实现公开读、受限写。
- 惰性对象 newLazyGhost():自 8.4 起,用于 DI 容器中的延迟初始化。
- 管道操作符 |>:自 8.5 起,用于从左到右的数据转换链。
- clone() 函数 + $withProperties:自 8.5 起,用于不可变 "with" 更新,包括 readonly。
- #[\NoDiscard]:自 8.5 起,强制消费返回值。
使用方式
技能定义了强制性的代理工作流:
在编写 PHP 之前,并行启动 3 个代理,每个代理调用一次并指定名称:
- fuse-ai-pilot:explore-codebase —— 检测项目的最低 PHP 版本(composer.json 的 require.php、CI 矩阵)。
- fuse-ai-pilot:research-expert —— 在使用某特性前,在 php.net 上核实其版本与语法。
- mcp__context7__query-docs —— 交叉核对惯用法。
编写完成后,运行 fuse-ai-pilot:sniper 进行验证。
关键规则
- 使用 Attribute,绝不用 docblock 注解——原生 #[Attribute] 取代用于路由、ORM、DI、校验的 @annotation docblock。这是 LLM 的头号错误,详见 attributes-over-docblocks.md。
- 先检查目标 PHP 版本——绝不要在 8.1 项目上输出 8.5 语法。选择特性前先读取 composer.json 的 require.php。
- 封闭值集合优先使用枚举而非类常量——枚举带有类型安全和方法。
- 优先使用 readonly + 属性钩子,而非手写 getter/setter——样板更少,强制不可变性。
- 每个文件顶部使用 declare(strict_types=1);。
架构
技能给出的目录结构示例:
src/ ├── Enum/ │ └── Status.php # backed 枚举 + 接口 + 方法 ├── ValueObject/ │ └── Money.php # readonly 类,clone() 配合 $withProperties └── Model/ └── User.php # 属性钩子,非对称可见性
完整可运行代码见 modern-class.md。
参考指南
概念类参考:
- PHP 8.5 特性:php-85-features.md —— 管道操作符、clone()、#[\NoDiscard]、静态非对称可见性。
- PHP 8.4 特性:php-84-features.md —— 属性钩子、非对称可见性、惰性对象、#[\Deprecated]。
- 8.1–8.3 基线:php-81-83-baseline.md —— 枚举、readonly、纤程、#[\Override]。
- Attribute 与 docblock 对比:attributes-over-docblocks.md —— 任何元数据:路由、ORM、DI、校验。
模板:
- modern-class.md —— 以现代方式编写新类时使用。
最佳实践
应当:
- 选择特性版本前先读取 require.php。
- 对有状态的值集合使用带接口和方法的枚举。
- 使用属性钩子进行校验 / 计算,而非魔术方法 __get。
- 使用管道操作符展平嵌套调用(8.5+)。
不应:
- 编写 @Route/@ORM\Column docblock 注解——应使用 attribute。
- 在未确认项目支持的情况下输出 8.4/8.5 语法。
- 在钩子或 readonly 适用时手写 getter/setter。
- 猜测特性的版本——应在 php.net 上核实。
适用场景
适用于编写现代非框架 PHP 8.1–8.5 代码,尤其是需要正确使用原生 Attribute、枚举、readonly、属性钩子、非对称可见性、管道操作符等语言特性时。
限制
不适用于代码风格、PSR 合规或自动加载(属于 php-standards),也不适用于 Laravel 专有语法约定(属于 Laravel 插件)。