ARTICLE DETAIL

资讯详情

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

PHP-CS-Fixer 规则详解:no_multiple_statements_per_line 强制一行一条语句

PHP-CS-Fixer 规则详解:no_multiple_statements_per_line 强制一行一条语句 开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载导读no_multiple_statements_per_line是 PHP-CS-Fixer 中Basic规则组的一条基础规则其核心目标是一行只允许出现一条语句即把同一行内用分号串联的多条语句拆分成独立的多行。它在当前项目中直接对应 PSR2 规范 2.3 节 Lines 的要求并被PSR2、PSR12、PER-CS、Symfony等多个主流规则集默认收录。读完本文你将掌握该规则的触发条件、修复行为、边界情况如for循环头、PHP 8.4 属性钩子、注释夹缝中的分号并能在自己的项目中以命令行或配置文件方式精准启用它。规则简介它解决什么问题在编写 PHP 代码时开发者偶尔会把多条语句挤在同一行例如?php foo(); bar();这种写法虽然合法但可读性差也与 PSR2/PER Coding Style 倡导的一行一条语句约定相悖。PHP-CS-Fixer 提供的no_multiple_statements_per_line规则会自动将这类代码拆分为每行一条语句其官方定义与文档说明见 doc/rules/basic/no_multiple_statements_per_line.rstThere must not be more than one statement per line.规则的完整描述、示例与所属规则集清单均记录在该文档中同时它被归类在PhpCsFixer\Fixer\Basic命名空间下与braces_position、encoding等基础排版规则并列。修复效果文档中的标准示例规则文档给出了唯一的官方 diff 示例展示修复前后的变化--- Original New ?php -foo(); bar(); foo(); bar();即输入foo(); bar();时规则会在第一条语句结束后插入换行与缩进将其拆成两条独立的语句行。这个示例同时以CodeSample形式存在于 src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php 的定义中new FixerDefinition( There must not be more than one statement per line., [new CodeSample(?php\nfoo(); bar();\n)], )注意该规则没有任何可配置选项。它继承自AbstractFixer而非ConfigurableFixerInterface因此启用时只需写no_multiple_statements_per_line true无需也不能传入额外参数。底层实现Fixer 是如何工作的要准确预判该规则的修复行为需要阅读其实现 src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php。整个类只有三个核心方法逻辑相当精巧。isCandidate快速筛选public function isCandidate(Tokens $tokens): bool { return $tokens-isTokenKindFound(;); }候选判定只做一件事检查整个文件是否包含分号;。由于 PHP 语句几乎都以分号结尾绝大多数 PHP 文件都会命中候选但纯标记、无语句的文件会被快速跳过避免无谓的完整遍历。applyFix核心拆分逻辑修复逻辑对 Token 流进行线性扫描处理过程可以概括为三步跳过不该碰的区域遇到T_FOR时直接用findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS, ...)跳过整个for (...)括号块——for循环头内部的分号是语法分隔符而非语句分隔符绝不能拆行遇到CT::T_PROPERTY_HOOK_BRACE_OPENPHP 8.4 属性钩子语法时跳过整个属性钩子块避免破坏get;/set;这类钩子声明。定位分号逐个 Token 查找;。向前探测并拆分从分号后的下一个 Token 开始扫描若遇到含换行符的空白或注释通过Preg::match(/\R/, ...)判断\R通用换行符说明后续语句已经另起一行直接break不干预若下一个有效 Token 是}、闭合标签?或endif/endfor/endswitch/endwhile/endforeach等替代语法结束标记说明这是语句块的最后一条语句同样不干预否则说明同一行还有后续语句此时通过ensureWhitespaceAtIndex()在分号后插入换行符 行缩进。换行与缩进由谁决定该 Fixer 实现了WhitespacesAwareFixerInterface并使用IndentationTrait换行符取自whitespacesConfig-getLineEnding()即遵循项目配置的line_ending\n或\r\n不会硬编码缩进通过getLineIndentation($tokens, $index)读取当前语句所在行的既有缩进保证拆出的新行与原行对齐。这两点保证了拆分结果与项目既有排版风格完全一致。优先级与执行顺序与相邻规则的协作getPriority()返回-1并显式声明了执行顺序约束见 src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php必须运行在BracesPositionFixer、CurlyBracesPositionFixer之前因为先拆分多语句行再做花括号定位可以避免花括号规则在多语句行场景下误判必须运行在ControlStructureBracesFixer、NoEmptyStatementFixer、YieldFromArrayToYieldsFixer之后这些规则可能新增或删除分号先执行它们能让本规则面对的是稳定的 Token 流。这些约束同样体现在其他 Fixer 的注释中例如 BracesPositionFixer 声明 Must run after ... NoMultipleStatementsPerLineFixerNoEmptyStatementFixer 声明 Must run before ... NoMultipleStatementsPerLineFixer。框架的FixerFactory会依据这些优先级自动排序无需使用者手工编排。边界行为测试用例揭示的细节该规则的行为边界由 tests/Fixer/Basic/NoMultipleStatementsPerLineFixerTest.php 中的用例精确锁定这些用例同时构成向后兼容承诺的一部分。理解它们可以避免对规则产生错误预期输入场景修复行为原因foo(); bar();拆成两行最基本的多语句行for ($i 0; $i 10; $i) { foo(); }不改动for头内的分号被跳过?php $a; $b ?拆成$a;与$b ?两行闭合标签?前的分号同样处理?php if ($foo) { foo(); }不改动分号后紧跟}已是块内最后一条语句?php foo(); ?不改动分号后紧跟闭合标签if/for/foreach/while/switch替代语法结尾不改动分号后是endif/endfor等结束标记foo();/* comment */bar();拆成两行注释随第一条语句保留无换行的注释不阻断扫描仍判定为同行多语句PHP 8.4 属性钩子public string $readable { get; }不改动属性钩子块整体跳过其中最后一条用例通过#[RequiresPhp( 8.4.0)]标注仅在 PHP 8.4 环境执行见 NoMultipleStatementsPerLineFixerTest.php体现了项目对语言新特性的持续跟进。所属规则集开箱即用还是按需启用规则文档明确列出no_multiple_statements_per_line是以下 12 个规则集的成员文档原路径为 doc/rules/basic/no_multiple_statements_per_line.rst规则集清单对应 doc/ruleSets 目录下的各文件PER已弃用PER-CSPER-CS1.0已弃用PER-CS1x0PER-CS2.0已弃用PER-CS2x0PER-CS3.0已弃用PER-CS3x0PhpCsFixerPSR2PSR12Symfony这些规则集之间的继承链在源码中清晰可查规则最初定义于 PSR2Set.phpno_multiple_statements_per_line true对应 PSR2 规范 2.3 节PSR12Set 通过PSR2 true继承PERCS1x0Set 通过PSR12 true继承PER-CS2x0包含PER-CS1x0PER-CS3x0又包含PER-CS2x0形成逐版累积的链条PERCSSet 是PER-CS别名自动指向最新非弃用的 PER-CS 版本SymfonySet 通过PER-CS3x0 true继承PhpCsFixerSet 同时包含PER-CS与Symfony。因此只要你在配置中使用上述任一规则集该规则就会默认生效无需单独声明这也意味着绝大多数采用 PSR2/PSR12/Symfony 风格的项目都会在格式检查时受此规则约束。如何启用与验证方式一命令行单独指定针对单个文件或目录执行并只启用这一条规则php php-cs-fixer fix path/to/your/file.php --rulesno_multiple_statements_per_line--rules参数接受逗号分隔的规则名或规则集名例如--rulesSymfony即可启用整组规则。--dry-run可先预览将被修改的文件而不实际写入--diff可输出与文档示例同格式的 diff。方式二项目配置文件在项目根目录的.php-cs-fixer.php或.php-cs-fixer.dist.php中配置?php $finder PhpCsFixer\Finder::create()-in(__DIR__); return (new PhpCsFixer\Config()) -setRules([ // 单独启用 no_multiple_statements_per_line true, // 或直接引入包含它的规则集 // PSR12 true, ]) -setFinder($finder) ;随后运行php php-cs-fixer fix即可按配置批量修复。验证规则行为想要快速验证该规则的拆分效果可以复制一个包含foo(); bar();的测试文件用--rulesno_multiple_statements_per_line --diff --dry-run观察 diff也可以直接运行该规则自带的单元测试来确认当前环境的修复行为与官方承诺一致。测试由 tests/Fixer/Basic/NoMultipleStatementsPerLineFixerTest.php 定义其中每个用例都被视为项目向后兼容承诺的一部分——也就是说官方保证在支持的 PHP 版本上这些用例所示的修复行为不会随意改变你可以放心依赖它做自动化格式检查CI 中通常以--dry-run --diff方式作为流水线关卡。小结no_multiple_statements_per_line是一条小而稳的排版规则它只负责把同行多语句拆成一行一条却通过跳过for循环头、替代语法结束标记、PHP 8.4 属性钩子等精心设计的边界处理做到了不误伤任何合法语法同时借助规则集继承链成为 PSR2/PSR12/PER-CS/Symfony 等主流风格集的默认成员。理解它的实现细节与边界用例能帮助你在自定义规则组合时准确预判修复结果避免把规则误报错怪到它头上。赞分享开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载相关推荐PHP-CS-Fixer 规则详解single_import_per_statement 强制一个 use 关键字对应一条声明PHP CS Fixer 规则详解single_import_per_statement 强制一个 use 关键字对应一条声明 导读 single_impor开发工具代码质量静态分析Lint格式化鸣潮智能辅助工具游戏自动化新纪元鸣潮智能辅助工具游戏自动化新纪元 在当今快节奏的游戏环境中玩家们常常需要在《鸣潮》这类开放世界游戏中投入大量时间来完成重复性任务。从日常委托到声骸刷取从资开发工具代码质量静态分析Lint格式化PHP-CS-Fixer 规则详解statement_indentation——让 PHP 代码的每条语句都拥有正确缩进PHP CS Fixer 规则详解statement_indentation——让 PHP 代码的每条语句都拥有正确缩进 导读 statement_inden开发工具代码质量静态分析Lint格式化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表