首页/新闻资讯/正文详情

PHP-CS-Fixer 的 phpdoc_no_alias_tag 规则:统一 PHPDoc 标签命名,清除 `@link`、`@type` 等别名写法

发布时间:2026/9/23 17:01:35 来源:云帆数科 栏目:资讯中心
PHP-CS-Fixer 的 phpdoc_no_alias_tag 规则:统一 PHPDoc 标签命名,清除 `@link`、`@type` 等别名写法
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),仅供参考

相关推荐

PINN求解微分方程:一套可直接复现的Python代码包
PINN求解微分方程:一套可直接复现的Python代码包

简介:面向物理信息神经网络(PINN)学习者与科研人员,这份压缩包提供了一套完整的Python实现案例,覆盖常微分方程、偏微分方程以及Lorenz系统等典型问题,并包含DeepXDE框架的泊松方程示例,帮助读者… · 2026/9/23 17:01:35

ant-design-mobile Switch 组件完全指南:从 API 应用到异步加载原理
ant-design-mobile Switch 组件完全指南:从 API 应用到异步加载原理

UI组件前端移动开发 【免费下载链接】ant-design-mobile Essential UI blocks for building mobile web apps. 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-mobile 点击查看 免费下载 本文以 ant-design-mobile 移动端组件库中的 Switch 开关组件文档… · 2026/9/23 17:01:35

AWS SDK for Go v2 内部 checksum 模块演进全解析:从算法支持到请求校验与重试缓存
AWS SDK for Go v2 内部 checksum 模块演进全解析:从算法支持到请求校验与重试缓存

人工智能AI AgentAgent 沙箱云原生容器运行时零信任 【免费下载链接】substrate Agent Substrate: the core system 项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate 点击查看 免费下载 本指南以 substrate 仓库中 vendor 的 AWS SDK for Go … · 2026/9/23 17:01:29

从专科到博士 —— 不同学历用汇写写毕业论文的真实体验
从专科到博士 —— 不同学历用汇写写毕业论文的真实体验

同一个 "毕业文章" 功能,专科生和博士生用起来感觉完全不同。因为学历层次选不同,AI 生成的内容深度、文献层次、章节复杂度都不一样。汇写(https://www.huixielunwen.com/tool/graduationThesis)在学历选择上分了专科、… · 2026/9/23 18:16:59

企鹅数据集VOC与YOLO双格式:120张图小样本目标检测全流程
企鹅数据集VOC与YOLO双格式:120张图小样本目标检测全流程

简介:这份企鹅目标检测数据集面向计算机视觉入门者与需要小型样本练手的算法开发者,用于验证检测模型在单一类别场景下的训练与推理效果。资源包共364个文件,以121张jpg图片、121个xml标注文件和122个txt标注文件为主,压缩包约17.… · 2026/9/23 18:16:53

提纲怎么编辑 —— 毕业文章第三步的结构微调技巧
提纲怎么编辑 —— 毕业文章第三步的结构微调技巧

汇写四步流程的第三步是 "确认文章提纲"。很多人到这一步直接点下一步,觉得 AI 列的大纲挺好。其实这一步是你对论文结构施加影响的最佳时机,改好了事半功倍。汇写(https://www.huixielunwen.com/tool/graduationThesis&#xff09… · 2026/9/23 18:16:53

行人实例分割数据集实战:YOLO格式解析与YOLOv8训练避坑指南
行人实例分割数据集实战:YOLO格式解析与YOLOv8训练避坑指南

简介:行人实例分割数据集面向计算机视觉开发者、算法工程师及高校研究人员,聚焦行人目标的精细化识别与轮廓分割任务。资源共2000个文件,以1226个txt标注文件、772张jpg图像为主,另含1个yaml配置文件与1份docx说明文档&#xff0c… · 2026/9/23 18:16:47

通达信MACD选股公式源码拆解与实战编写指南
通达信MACD选股公式源码拆解与实战编写指南

1. 拆解“极品超准版”选股公式的真实逻辑1.1 标题背后的核心诉求与理性认知先把话说在前头:任何宣称“几乎100%胜率”的选股公式,从交易逻辑上讲都是不成立的。市场本质是概率游戏,不存在稳赚不赔的圣杯。但为什么这类标题总能吸引大量关注&… · 2026/9/23 18:16:47

半导体工艺课程设计实战:从TCAD仿真到版图设计要点
半导体工艺课程设计实战:从TCAD仿真到版图设计要点

2023年春季,我帮一组学弟学妹做半导体工艺课程设计的方案评审,翻了几版PPT和仿真截图,最大的感受是:他们不是不会用软件,而是根本不知道自己在做什么。仿真曲线画得漂亮,但问到底层为什么选这个注入剂量、为… · 2026/9/23 18:16:40

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码