SuperAPI AI 工具集

php-language-modern

编程与开发

查看项目

更新于 10-26 16:23

技能介绍

用途

本技能用于编写现代非框架 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 插件)。