ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PHPStan 错误标识符 method.deprecatedEnum 详解:如何在废弃枚举上调用方法时精准报错

PHPStan 错误标识符 method.deprecatedEnum 详解:如何在废弃枚举上调用方法时精准报错 PHPStan 错误标识符 method.deprecatedEnum 详解如何在废弃枚举上调用方法时精准报错【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址: https://gitcode.com/gh_mirrors/ph/phpstanmethod.deprecatedEnum是 PHPStan 在调用一个被deprecated标记的枚举enum上的实例方法时报告的错误标识符error identifier。本文以 method.deprecatedEnum.md 为核心骨架结合仓库中同族错误文档与 errorsIdentifiers.json 中记录的实现类讲清该错误的触发场景、背后规则来源、修复方式与忽略策略帮助你理解枚举整体废弃在静态分析中的传播逻辑。错误速览属性值标识符method.deprecatedEnum一句话描述调用的方法所属的枚举被标记为deprecatedCalled method belongs to an enum marked asdeprecated.是否可忽略是frontmatter 中ignorable: true提供规则的扩展phpstan/phpstan-deprecation-rules对应规则类PHPStan\Rules\Deprecations\RestrictedDeprecatedMethodUsageExtension该文档的 frontmatter 由 website/errors/method.deprecatedEnum.md 顶部给出同时可在 errorsIdentifiers.json 的method.deprecatedEnum条目中查到其规则类归属与源码定位信息。触发该错误的代码示例在 PHP 8.1 中枚举可以像类一样拥有方法。当一个枚举整体被deprecated标记时调用它的实例方法就会命中method.deprecatedEnum?php declare(strict_types 1); /** deprecated Use NewStatus instead */ enum OldStatus: string { case Active active; case Inactive inactive; public function label(): string { return $this-value; } } function doFoo(OldStatus $status): void { $status-label(); // ERROR: Call to method label() of deprecated enum OldStatus. }示例的关键点被废弃的是枚举本身deprecated Use NewStatus instead而不是label()方法label()方法本身没有deprecated标记但调用仍会报错因为整个枚举已被标记废弃报告的错误消息为Call to method label() of deprecated enum OldStatus.。为什么会被报告根据 method.deprecatedEnum.md 的说明该错误由phpstan/phpstan-deprecation-rules扩展报告。核心语义是对一个被deprecated标记的枚举的实例调用方法等于在使用这个即将被移除或替换的 API。即使方法本身未废弃只要枚举整体废弃枚举的所有用法——包括调用它的方法——都应当被替换为文档建议的替代方案。这种废弃传播是 deprecation-rules 的典型设计废弃标记会沿着类型引用关系扩散。从 errorsIdentifiers.json 中method.deprecatedEnum条目可以看到它对应规则类为PHPStan\Rules\Deprecations\RestrictedDeprecatedMethodUsageExtension来源于phpstan/phpstan-deprecation-rules同族标识符如method.deprecatedInterface、method.deprecatedTrait也由同一规则类负责说明该扩展对类、接口、特质、枚举上的废弃方法调用采用统一的分析逻辑。同族标识符废弃枚举的全家族报告method.deprecatedEnum只是废弃枚举标识符家族中的一员。仓库的 website/errors 目录下还存在一系列同类标识符覆盖了枚举在代码中出现的几乎所有位置标识符触发场景method.deprecatedEnum在废弃枚举实例上调用方法staticMethod.deprecatedEnum在废弃枚举上调用静态方法new.deprecatedEnum对废弃枚举使用new表达式property.deprecatedEnum属性类型引用了废弃枚举staticProperty.deprecatedEnum访问废弃枚举的静态属性classConstant.deprecatedEnum访问废弃枚举的常量parameter.deprecatedEnum函数/方法参数类型引用废弃枚举return.deprecatedEnum返回类型引用废弃枚举instanceof.deprecatedEnuminstanceof表达式使用废弃枚举catch.deprecatedEnumcatch块捕获废弃枚举attribute.deprecatedEnum属性attribute使用废弃枚举assert.deprecatedEnumphpstan-assert断言类型引用废弃枚举methodTag.deprecatedEnummethodPHPDoc 标签引用废弃枚举propertyTag.deprecatedEnumpropertyPHPDoc 标签引用废弃枚举varTag.deprecatedEnumvarPHPDoc 标签引用废弃枚举mixin.deprecatedEnummixinPHPDoc 标签引用废弃枚举typeAlias.deprecatedEnum类型别名引用废弃枚举sealed.deprecatedEnumphpstan-sealed标签引用废弃枚举selfOut.deprecatedEnumphpstan-self-out标签引用废弃枚举requireExtends.deprecatedEnumphpstan-require-extends标签引用废弃枚举requireImplements.deprecatedEnumphpstan-require-implements标签引用废弃枚举traitUse.deprecatedEnumuse特质引用废弃枚举generics.deprecatedEnumBoundtemplate T of边界约束引用废弃枚举generics.deprecatedEnumDefaulttemplate T 默认值引用废弃枚举这些标识符的命名与 CLAUDE.md 中Identifier prefix reference一节的规则一致——前缀method、property、new等表示废弃枚举出现的语言位置后缀deprecatedEnum表示被废弃的对象类型。阅读同族文档可帮助你理解只要代码库中某处引用了废弃枚举PHPStan 就能在几乎所有引用点上给出提示。如何修复修复思路很直接把废弃枚举的用法替换为推荐的替代枚举。方案一替换为推荐的替代枚举原文档给出的修复方案是将参数类型从OldStatus改为推荐的NewStatus?php declare(strict_types 1); -function doFoo(OldStatus $status): void function doFoo(NewStatus $status): void { $status-label(); }注意仅替换调用点还不够——如果NewStatus是新枚举还需要确认label()方法在新枚举中同样存在或相应调整调用并同步更新所有传入OldStatus的上游调用方避免类型不匹配引发新的method.notFound或参数类型错误。方案二配合 PHPStan 的 reportUnmatchedIgnoredErrors 进行迁移管理在大型代码库中一次性替换所有废弃枚举的用法往往不现实。推荐的迁移路径是先让 PHPStan 在 baseline 中记录现有错误ignorable: true意味着这些错误可以被ignoreErrors或 baseline 机制忽略再逐步替换。例如在phpstan.neon中通过phpstan-baseline.neon收纳现有问题替换完成后配合reportUnmatchedIgnoredErrors检查不再触发的忽略项确保没有遗留的过时忽略。仓库中的 e2e/baseline 目录展示了 baseline 机制的最小配置形态includes: phpstan-baseline.neon可作为参考。方案三正在迁移中的代码可临时标记废弃如果你的调用方代码本身属于废弃迁移的一部分即它也在被废弃的 API 链路上可以给调用方函数或类加上deprecated标记——deprecation-rules 对废弃代码调用废弃 API的场景通常不再报告从而避免迁移中间态的噪音。这一点在同族文档 staticMethod.deprecatedEnum.md 中有明确说明/** deprecated */ function doFoo(): void { OldStatus::getDefault(); }用 ignoreErrors 精确忽略单点错误如果某个调用确实无法立即修复也可以使用 PHPStan 的ignoreErrors配置按标识符精确忽略例如在phpstan.neon中parameters: ignoreErrors: - identifier: method.deprecatedEnum path: src/Legacy/OrderHandler.php由于该标识符ignorable: truePHPStan 会接受这类按标识符的忽略规则并将匹配情况纳入未匹配忽略项的报告。延伸废弃枚举相关边界情况枚举无法实例化new.deprecatedEnum是理论上的标识符同族文档 new.deprecatedEnum.md 指出一个有趣的边界PHP 本身不允许对枚举使用new因此触发该标识符的代码在语法层面就无法成立。PHPStan 在这种情况下总是同时报告new.enum错误而new.deprecatedEnum在实践中不会被单独报出。这提醒我们不要为了触发某个标识符而构造不可能执行的代码错误标识符的设计以真实可写的代码为准。枚举的静态方法调用同样会被拦截staticMethod.deprecatedEnum.md 展示了另一种常见形态——在废弃枚举上调用静态方法OldStatus::getDefault(); // ERROR: Static method getDefault() of deprecated enum OldStatus.该文档还补充了一个重要细节在废弃枚举上调用被标记废弃的静态方法也会报告此错误无论枚举本身是否废弃。也就是说废弃枚举本身与废弃方法任一方命中都会触发报告二者是或的关系。属性类型引用废弃枚举property.deprecatedEnum.md 展示了废弃枚举作为属性类型声明时的报告同时覆盖静态属性的访问场景。这印证了废弃标记会沿类型声明传播一旦枚举被废弃所有把它作为类型的代码位置都会进入 deprecation-rules 的监控范围。与 PHPStan 错误标识符体系的关联method.deprecatedEnum是 PHPStan 2.x 错误标识符体系的一部分。标识符为每条错误提供了稳定的机器可读 ID使得ignoreErrors可以按语义精确匹配而不是依赖易碎的错误消息文本。这一体系的文档生成规范记录在 CLAUDE.md 中其格式要求每条错误文档包含触发代码示例、报告原因解释、修复方式三部分并统一以diff-php展示代码变更。本文对应的 method.deprecatedEnum.md 即是该规范的标准产物。若要进一步研究该标识符的底层实现可以查看 errorsIdentifiers.json 中method.deprecatedEnum条目其中记录了规则类RestrictedDeprecatedMethodUsageExtension及其在phpstan/phpstan-deprecation-rules仓库中的源码定位phpstan-deprecation-rules是独立于本仓库发布的扩展包需要在项目中通过 Composer 单独安装并在phpstan.neon中引入其配置文件后该类错误才会被启用。小结method.deprecatedEnum在调用被deprecated标记枚举的实例方法时报告即使方法本身未废弃该错误由phpstan/phpstan-deprecation-rules扩展的RestrictedDeprecatedMethodUsageExtension规则产生同族标识符覆盖了废弃枚举在类型、属性、常量、参数、PHPDoc 标签等全部引用位置修复的核心是替换为推荐枚举迁移中可借助 baseline、deprecated传递标记或按标识符ignoreErrors平滑推进该标识符ignorable: true支持通过ignoreErrors.identifier精确忽略。【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址: https://gitcode.com/gh_mirrors/ph/phpstan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表