拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PHP-CS-Fixer `object_operator_without_whitespace` 规则详解:消除对象运算符 `->` 与 `?->` 两侧空白

开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载object_operator_without_whitespace是 PHP-CS-Fixer 中一条用于统一对象运算符书写格式的规则它确保对象运算符-以及 PHP 8.0 引入的空安全运算符?-前后不出现空白字符。本文以官方文档 doc/rules/operator/object_operator_without_whitespace.rst 为核心结合 ObjectOperatorWithoutWhitespaceFixer 源码与 测试用例讲解规则行为、修复边界、所属规则集以及实际使用方式帮助你理解并正确地在项目中启用这条规则。规则概述该规则的核心约束用一句话概括There should not be space before or after object operators-and?-.即对象运算符-与?-前后不应存在空格。规则官方定义位于 FixerDefinition其代码示例为?php $a - b;修复后变为?php $a-b;该规则属于operator运算符类目对应的修复器类为PhpCsFixer\Fixer\Operator\ObjectOperatorWithoutWhitespaceFixer归属于命名空间PhpCsFixer\Fixer\Operator。修复行为与源码实现从源码结构看该修复器继承自AbstractFixer实现非常轻量核心逻辑全部集中在applyFix()方法中src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.phpprotected function applyFix(\SplFileInfo $file, Tokens $tokens): void { // [Structure] there should not be space before or after - or ?- foreach ($tokens as $index $token) { if (!$token-isObjectOperator()) { continue; } // clear whitespace before - if ($tokens[$index - 1]-isWhitespace( \t) !$tokens[$index - 2]-isComment()) { $tokens-clearAt($index - 1); } // clear whitespace after - if ($tokens[$index 1]-isWhitespace( \t) !$tokens[$index 2]-isComment()) { $tokens-clearAt($index 1); } } }其工作流程可以拆解为三个步骤候选判定isCandidateisCandidate()通过Token::getObjectOperatorKinds()检查代码中是否出现对象运算符 tokensrc/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php。getObjectOperatorKinds()在 src/Tokenizer/Token.php 中定义返回两种 tokenT_OBJECT_OPERATOR普通对象运算符-FCT::T_NULLSAFE_OBJECT_OPERATOR空安全对象运算符?-。该 token 在 src/Tokenizer/FCT.php 中定义当 PHP 版本 8.0 时映射为原生T_NULLSAFE_OBJECT_OPERATOR否则使用自定义占位值-803以保证解析器在低版本环境下也能识别。如果代码中完全没有对象运算符修复器会直接跳过不影响性能。遍历 token 流对Tokens集合逐 token 遍历每当遇到isObjectOperator()返回 true 的 token即-或?-就检查其前后相邻 token。清除空白运算符前若$tokens[$index - 1]是仅由空格或制表符\t组成的空白 token并且$tokens[$index - 2]不是注释则清除该空白运算符后若$tokens[$index 1]是空格/制表符空白 token且$tokens[$index 2]不是注释则清除该空白。isWhitespace( \t)意味着该方法只处理空格和水平制表符因此换行符、回车符等垂直空白不会被移除这为多行链式调用保留了换行格式。关键边界注释保护源码中两处都带有!$tokens[$index - 2]-isComment()/!$tokens[$index 2]-isComment()的条件判断。这意味着如果运算符前/后的空白紧邻注释则保留该空白避免修复器破坏注释与代码之间的分隔关系典型场景是运算符后的行尾注释例如$a-method(); // comment的写法中运算符后方的空白不会被误删。该边界行为在测试用例中得到验证?php $this -add() // Some comment -delete();,见 tests/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixerTest.php带注释的多行链式调用不会被破坏。典型修复示例官方文档给出一个 diff 示例Example #1--- Original New -?php $a - b; ?php $a-b;测试类 ObjectOperatorWithoutWhitespaceFixerTest 通过provideFixCases数据提供器进一步覆盖了更丰富的场景tests/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixerTest.php输入Original输出New说明?php $object -method();?php $object-method();运算符前多空格?php $object - method();?php $object-method();运算符前后均多空格?php $object- method();?php $object-method();运算符后多空格?php $object\t-method();?php $object-method();制表符tab也被清除?php $object-\tmethod();?php $object-method();运算符后制表符被清除?php $object\t-\tmethod();?php $object-method();制表符组合场景以上用例说明该规则不仅处理普通空格同时处理制表符\t。PHP 8.0 空安全运算符支持对于 PHP 8.0 引入的空安全运算符?-测试类通过#[RequiresPhp( 8.0.0)]标注的provideFix80Cases数据提供器覆盖tests/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixerTest.php输入Original输出New?php $object?- method();?php $object?-method();?php $object ?- method();?php $object?-method();即?-与-的修复策略完全一致。不会误伤的边界场景字符串字面量?php echo use it as - you want;中字符串内部的-不会受影响——因为修复器基于 token 流而非文本替换字符串属于T_CONSTANT_ENCAPSED_STRINGtoken不会被当作对象运算符处理测试见 tests/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixerTest.php。多行链式调用换行符不属于 \t集合因此以下风格会被完整保留tests/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixerTest.php?php $object-method() -method2() -method3();注释相邻空白如前文所述紧邻注释的空白不会被清除保证// Some comment这类注释在链式调用中不被破坏。所属规则集根据官方文档该规则是以下两个规则集的一部分PhpCsFixerdoc/ruleSets/PhpCsFixer.rstSymfonydoc/ruleSets/Symfony.rst在源码中Symfony规则集于 src/RuleSet/Sets/SymfonySet.php 显式启用了该规则object_operator_without_whitespace true,而PhpCsFixer规则集通过继承Symfony自动包含该规则——其定义在 src/RuleSet/Sets/PhpCsFixerSet.php 中设置了Symfony true并在文档中描述为基于PER-CS与Symfony的高度主观化推荐规则集src/RuleSet/Sets/PhpCsFixerSet.php。因此如果你的项目已经采用Symfony或PhpCsFixer风格本规则会自动生效无需额外配置。如何启用与使用1. 通过规则集启用推荐在.php-cs-fixer.php配置文件中使用规则集?php $finder PhpCsFixer\Finder::create() -in(__DIR__) ; return (new PhpCsFixer\Config()) -setRules([ Symfony true, ]) -setFinder($finder) ;由于Symfony已包含object_operator_without_whitespace上述配置即可让规则生效。2. 单独启用该规则若项目不使用上述规则集也可以单独启用return (new PhpCsFixer\Config()) -setRules([ object_operator_without_whitespace true, ]) -setFinder($finder) ;3. 命令行检查启用后可通过命令行验证效果dry-run 只报告不修改php php-cs-fixer fix --dry-run --diff输出中会以 diff 形式展示-与?-两侧多余空白被移除的具体改动确认无误后去掉--dry-run即可实际修复文件。与其他相关规则的配合从 doc/rules/operator/index.rst 可知operator类目下还有其他与空白相关的运算符规则例如binary_operator_spaces二元运算符两侧空白、concat_space字符串连接符两侧空白等。object_operator_without_whitespace只关注对象运算符-/?-与它们互不冲突共同保证运算符书写的统一风格。兼容性说明最低 PHP 版本要求修复器本体不依赖 PHP 8 特性?-的识别通过FCT::T_NULLSAFE_OBJECT_OPERATOR的兼容映射实现PHP 8.0 时使用占位 token 值-803因此工具在低版本 PHP 环境下也能解析含?-语法的代码测试覆盖空安全运算符相关用例标注requires PHP 8.0.0仅在 PHP 8.0 环境中运行向后兼容承诺官方文档明确指出测试类 中定义的每个测试用例都属于向后兼容承诺的一部分——即该规则对已覆盖输入的处理行为在未来版本中不会发生破坏性变化。小结object_operator_without_whitespace是一条简单但实用的代码风格规则强制-与?-前后无空格/制表符基于 token 级别的精确处理不会误伤字符串中的-保留多行链式调用换行并保护与注释相邻的空白内置于Symfony与PhpCsFixer两大主流规则集开箱即用实现代码位于 src/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixer.php测试证据位于 tests/Fixer/Operator/ObjectOperatorWithoutWhitespaceFixerTest.php可供深入研读。对于追求代码风格一致性的团队直接启用该规则即可消除对象运算符两侧的空白不一致问题且无需任何参数配置。赞分享开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载相关推荐PHP-CS-Fixer concat_space 规则详解字符串拼接运算符空格规范化与配置实战PHP CS Fixer concat_space 规则详解字符串拼接运算符空格规范化与配置实战 导读 concat_space 是 PHP CS Fixer开发工具代码质量静态分析Lint格式化PHP CS Fixer 规则解析not_operator_with_space —— 为逻辑非运算符 ! 统一加上前后空白PHP CS Fixer 规则解析not_operator_with_space —— 为逻辑非运算符 ! 统一加上前后空白 本篇文章聚焦 PHP CS Fi开发工具代码质量静态分析Lint格式化SadTalker 本地部署完整指南三条命令让静态肖像开口说话SadTalker 本地部署完整指南三条命令让静态肖像开口说话 你手里有一张正面人像照和一段 30 秒的解说音频想让照片里的人说出这段话——CVPR 2开发工具代码质量静态分析Lint格式化上一篇agno 文本多标签分类实战用 output_schema 构建可复用的数据标注 Agent下一篇终极Git代码规范指南为什么顶级开源项目都遵循这些黄金法则创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门