用途
loom-php 是一个 PHP 语言技能,目标是帮助编写符合惯用法、达到生产质量的 PHP 8.x 代码。它假定使用者已具备 PHP 基础能力,重点放在容易写错的地方:隐式类型转换、松散比较、foreach 引用陷阱、长驻 worker 的状态泄漏、N+1 查询、不安全的 unserialize,以及如何编写能被 loom 的 phpunit 和 pest 适配器逐个选中的测试。
主要能力
- Composer 与自动加载:介绍依赖增删、按锁文件安装、生产安装、更新单个包、重新生成自动加载、清单校验与漏洞审计等命令。建议应用提交 composer.lock;用 config.platform.php 固定解析所用 PHP 版本;PSR-4 要求一个文件一个类、命名空间前缀映射到目录。
- 格式与静态分析:提及 PHP-CS-Fixer、Laravel Pint、PHP_CodeSniffer,以及 PHPStan、Psalm、Larastan;旧代码可采用基线(--generate-baseline)并逐步缩小;泛型只存在于 docblock 注释中。升级可用 Rector 自动化。
- 质量门禁:给出由 composer validate、代码格式检查、静态分析、测试和 composer audit 组成的检查流程。
- 类型与严格模式:每个文件以 declare(strict_types=1) 开头,否则标量参数会被强制转换;严格模式只作用于声明文件发起的调用。列出 PHP 8.0 至 8.4 的类型特性演进,包括联合类型、枚举、只读属性、只读类、DNF 类型、类型化类常量、属性钩子和非对称可见性等。
- 枚举与只读:说明纯枚举与 backed 枚举、from/tryFrom/cases 的差异,match 使用 === 比较且无匹配分支时抛 UnhandledMatchError;只读属性需带类型且为浅只读,只读类禁止动态属性;修改只读值对象应构造新实例。
- 错误与异常:区分 Error 与 Exception;建议库定义标记接口并继承 SPL 异常;用 previous 链式保留原因;JSON 处理使用 JSON_THROW_ON_ERROR;preg_* 失败需检查返回值与 preg_last_error_msg();finally 中的 return 会覆盖 try 的返回值或在途异常;不要用 @ 静默错误。
- 并发与请求模型:PHP-FPM 为 share-nothing,每请求状态独立;Laravel Octane、RoadRunner、FrankenPHP worker 模式、Swoole、队列 worker 等长驻进程会在请求或任务间泄漏静态属性、单例和内存缓存,需显式重置并定期重启 worker;Fiber 是 AMPHP、ReactPHP、Revolt 的底层原语,应用代码很少直接使用;并行或延迟工作走队列或独立进程。
- Laravel 要点:用 with() 预加载避免 N+1,开发环境启用 preventLazyLoading 或 shouldBeStrict;$fillable 作为批量赋值白名单,配合 $request->validated();env() 只在 config/*.php 中使用,缓存配置后其他位置返回 null;事务内派发任务用 afterCommit(),队列处理器需幂等;大表用 chunkById/lazyById;测试可用 RefreshDatabase、Http::fake()、Queue::fake()、Mail::fake()、actingAs()。
- Symfony 要点:服务默认自动装配与自动配置,通过构造器注入,用属性标签注册事件监听器、消息处理器和命令;路由用 #[Route],#[MapRequestPayload] 反序列化并校验请求 DTO;Doctrine 的 persist 调度、flush 落盘,每工作单元 flush 一次,批量导入需分批 flush 并 clear(),懒加载关联会导致 N+1,可用 fetch-join 解决;授权用 voter;可用 debug:container、debug:router、lint:container 诊断。
- 测试(PHPUnit 与 Pest):PHPUnit 10+ 用属性替代注释元数据;数据提供器为 public static 并可命名用例;默认使用 assertSame;expectException 要在抛错代码之前调用;按需选择 createStub 与 createMock。Pest 基于 PHPUnit,提供 beforeEach/afterEach、expect、->with 数据集、arch 架构规则;tests/Pest.php 按目录绑定基类测试用例。
- Loom 测试运行器适配器:composer.json 依赖 pestphp/pest 时选 pest,否则选 phpunit;单测命令为 vendor/bin/phpunit --filter '{test}' {file} 或 vendor/bin/pest --filter '{test}' {file};test 字段为 PHPUnit 方法名或 Pest 描述。--filter 是模式匹配:名称需在文件内唯一且不能是其他测试的前缀;Pest 描述限字母、数字、空格、- 和 _;合同测试不要使用数据提供器或数据集,因为过滤器会运行全部数据集;Pest 合同测试需放在 tests/Pest.php 绑定对应基类测试用例的目录中。
使用方式
作为技能包,它提供规范、示例代码与命令参考,供编写或审查 PHP 代码、配置工具链和编写合同测试时使用。资料未提供具体安装命令或独立运行入口。
适用场景
适合 PHP 8.x 项目开发与代码审查,尤其是使用 Laravel 或 Symfony 的应用、需要严格类型与静态分析的项目,以及需要为 loom 编写可被单独选中的 PHPUnit/Pest 合同测试的场景。
限制
资料未提供收费、价格、平台支持范围或效果数据;关于 Loom 适配器,资料明确说明未采集测试样本,解析器依据运行器文档化输出编写,未选中任何测试即视为 NotSelected。