PHP-CS-Fixer 的 phpdoc_no_alias_tag 规则统一 PHPDoc 标签命名清除link、type等别名写法【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址: https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixerphpdoc_no_alias_tag是 PHP-CS-Fixer 提供的一条可配置 PHPDoc 修复规则其核心职责是禁止使用别名的 PHPDoc 标签它会把文档注释中出现的link、type、property-read、property-write等别名标签统一改写为官方推荐的标准标签see、var、property。本文以 doc/rules/phpdoc/phpdoc_no_alias_tag.rst 文档为主线结合 PhpdocNoAliasTagFixer 的源码实现与 PhpdocNoAliasTagFixerTest 的测试用例讲清规则的默认行为、replacements配置方式、底层执行原理以及它在Symfony、PhpCsFixer规则集中的实际配置帮助你在实际项目中安全启用并定制这条规则。规则概述做什么、不做什么这条规则的官方定义只有一句话No alias PHPDoc tags should be used.不应使用别名的 PHPDoc 标签。在 FixerDefinition 中可以看到它对应的CodeSample默认配置下property-read string $bar会被改写为property string $barlink baz会被改写为see baz。需要注意两个边界行为大小写敏感规则的类注释明确写着 Case-sensitive tag replace fixer它只会精确匹配指定大小写的标签不会误伤LINK这类写法不处理行内标签{inheritdoc}这类用大括号包裹的行内标签不在本规则的改写范围内相关职责由其他 fixer 承担。此外规则是可配置的文档中专门给出了Warning提示配置入口只有一个replacements。配置项replacements自定义旧标签 → 新标签映射replacements是这条规则唯一支持的配置选项其含义是被替换的注解与替换后新注解之间的映射关系Mapping between replaced annotations with new ones。属性值选项名replacements允许类型arraystring, string默认值[property-read property, property-write property, type var, link see]默认值future-mode[const var, property-read property, property-write property, type var, link see]默认配置共覆盖四组别名映射property-read→property只读属性的 PHPDoc 标签并入普通属性标签property-write→property只写属性的 PHPDoc 标签并入普通属性标签type→var类型声明标签统一为varlink→see链接标签统一为see。默认值与 future-mode 的区别从 PhpdocNoAliasTagFixer::createConfigurationDefinition 的实现可以看到默认值通过Future::getV4OrV3([const var], [])计算得出当启用了 future-modePHP_CS_FIXER_FUTURE_MODE环境变量为真或代码中通过Future::runWithEnforcedFutureMode()强制执行见 src/Future.php时会额外把const→var也纳入默认替换这正是文档中Default value (future-mode)那一行的来源——这属于 PHP-CS-Fixer 面向 v4.0 的默认值演进机制用于提前验证未来的破坏性变更。如何在配置文件中使用在.php-cs-fixer.php或.php-cs-fixer.dist.php配置文件中可针对项目自定义别名映射?php return (new PhpCsFixer\Config()) -setRules([ phpdoc_no_alias_tag [ replacements [ const var, link see, property-read property, property-write property, type var, ], ], ]) ;数组的键是被替换的旧标签值是替换后的新标签键值都必须是非空字符串。示例演示默认配置与自定义配置示例 1默认配置使用默认配置不传任何参数时原始代码?php /** * property string $foo * property-read string $bar * * link baz */ final class Example { }修复后变为?php /** * property string $foo * property string $bar * * see baz */ final class Example { }即property-read与link分别被改写为property与see而原本就合规的property保持不变。示例 2自定义配置[replacements [link website]]当项目自定义了别名映射时replacements会整体替换默认映射而不是与默认值合并。例如配置为[replacements [link website]]后?php /** * property string $foo * property-read string $bar * * link baz */ final class Example { }修复后变为?php /** * property string $foo * property-read string $bar * * website baz */ final class Example { }可以看到由于自定义配置中只声明了link websitelink被改写为website而property-read不再被改动默认的property-read property映射已被覆盖。这一点在配置时很容易踩坑——如果希望保留部分默认映射必须把它们一并写进自定义数组。底层实现代理到GeneralPhpdocTagRenameFixerPhpdocNoAliasTagFixer本身并不直接做正则替换它在源码层面是一个代理 fixerfinal class PhpdocNoAliasTagFixer extends AbstractProxyFixer见 src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php#L48通过 createProxyFixers 委托给通用标签重命名 fixerGeneralPhpdocTagRenameFixer完成实际工作。在 configurePostNormalisation 中规则把自身的replacements配置透传为代理 fixer 的四项参数fix_annotation true修复tag形式的注解标签fix_inline false不修复{tag}形式的行内标签呼应前文不处理行内标签的边界replacements即用户配置的映射表case_sensitive true开启大小写敏感匹配。真正执行替换的 applyFix 逻辑位于 src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php通过isCandidate()只扫描包含T_DOC_COMMENTtoken 的文件提高执行效率用正则/([\])[^\1]*\1(*SKIP)(*FAIL)|(?!\{)(?)(?Ptag%s)(?!\})/匹配注解标签其中(*SKIP)(*FAIL)技巧用于跳过字符串字面量中的内容避免误改数组键、字符串里的link之类文本对每个命中的T_DOC_COMMENTtoken 重建为新的 Token 并写回 tokens 序列。测试用例也验证了这一细节在 PhpdocNoAliasTagFixerTest 中phpstan-type结构体内部的link、type字符串键在修复前后保持原样只有真正的注解标签link example.com、type foo被改写。与其他 fixer 的执行顺序作为代理 fixer其 getPriority 直接返回底层代理的优先级GeneralPhpdocTagRenameFixer返回11见 GeneralPhpdocTagRenameFixer.php。它的执行顺序约束为必须在PhpdocAddMissingParamAnnotationFixer、PhpdocAlignFixer、PhpdocSingleLineVarSpacingFixer之前运行必须在AlignMultilineCommentFixer、CommentToPhpdocFixer、PhpdocIndentFixer、PhpdocScalarFixer、PhpdocToCommentFixer、PhpdocTypesFixer之后运行。也就是说标签重命名发生在注释被规范化、类型标签被标准化之后且先于依赖标签内容的对齐与参数补全逻辑保证后续 fixer 看到的是最终形态的标签名。非法配置哪些写法会被拒绝配置错误时规则会抛出InvalidFixerConfigurationException源码中通过捕获代理 fixer 的InvalidConfigurationException后重新包装抛出见 src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php#L111-L124。结合 provideInvalidConfigurationCases 的测试数据以下配置均会报错非法配置报错原因[replacements [1 abc]]被替换的键必须是字符串Tag to replace must be a string[replacements [a null]]值必须是字符串元素类型为null不合法[replacements [see link*/]]新标签不能包含空白或*/会破坏注释结构[foo 123]规则只认识replacements这一个选项[link see, a b, see link]存在循环/连锁替换冲突link要换成see而see又配置为换成link其中连锁冲突的校验逻辑位于 GeneralPhpdocTagRenameFixer 的 normalizer如果某个标签既是被替换源又是替换目标配置会被判定为自相矛盾而拒绝这避免了替换链循环导致的非确定性结果。所属规则集Symfony与PhpCsFixer根据文档说明该规则属于以下两个规则集PhpCsFixer配置为[replacements [const var, link see, property-read property, property-write property, type var]]Symfony配置同上。从源码印证Symfony规则集在 src/RuleSet/Sets/SymfonySet.php#L165-L173 中显式声明了phpdoc_no_alias_tag [replacements [...]]且包含了 future-mode 才有的const var映射源码注释// TODO 4.0 add to PhpdocNoAliasTagFixer defaults表明该映射计划在 v4.0 进入 fixer 默认值而 PhpCsFixerSet 的getRules()以PER-CS true和Symfony true为基础因此PhpCsFixer会经由Symfony间接启用本规则。这意味着只要启用了Symfony或PhpCsFixer规则集link、type、property-read、property-write、const这些别名标签就会被自动改写无需单独声明反之如果项目只按需启用个别规则则需要手动把phpdoc_no_alias_tag加入规则列表。验证与扩展阅读规则的官方行为由测试类 PhpdocNoAliasTagFixerTest 定义其中provideFixCases数据提供器覆盖了单标签映射、多标签映射、param array内嵌type结构体、const常量注解、以及phpstan-type字符串键不被误改等场景。按照项目的向后兼容承诺这些测试用例即官方支持行为的一部分升级 PHP-CS-Fixer 后如有疑虑可直接运行该测试类确认行为未变vendor/bin/phpunit tests/Fixer/Phpdoc/PhpdocNoAliasTagFixerTest.php若需要更通用的标签重命名能力例如重命名inheritDocs为inheritDoc、处理行内标签、关闭大小写敏感可以了解其底层实现 GeneralPhpdocTagRenameFixer它支持fix_annotation、fix_inline、case_sensitive三个额外选项是phpdoc_no_alias_tag能力边界的自然延伸。相关文档还可在 doc/rules/phpdoc/index.rst 索引中找到更多 PHPDoc 类规则的说明。【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址: https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
