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

发布时间:2026/9/23 18:29:40

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),仅供参考
延伸阅读

更多相关文章

2026/9/23 18:29:40

checkbox 和 radio 组件

一、实验目的掌握多选框checkbox和多选组checkbox‑group的用法;掌握单选框radio和单选组radio‑group的用法;学会通过bindchange事件获取选中项,动态修改页面样式;拓展新增30rpx字号单选选项;理解skyline渲染引擎对部…

2026/9/23 18:29:40

3分钟吃透电磁波谱图源码解析,面试不再卡壳

3分钟吃透电磁波谱图源码解析,面试不再卡壳 面试时被问“电磁波谱图原理详解”,你答得上来吗?大多数开发者一听就懵,觉得这是物理题,跟代码没关系。其实不然,在信号处理、通信模块开发或嵌入式系统中,理解 电磁波谱图…

2026/9/23 18:24:40

养老统筹怎么交:从入门到精通的避坑实战指南

养老统筹怎么交:从入门到精通的避坑实战指南 刚学完基础语法,代码能跑通,一动手搭项目就崩?这种“手残”时刻我太熟悉了。很多新人卡在配置环境、依赖管理或者数据落库的环节,明明教程里的代码是好的,自己一抄就报错。这就是从入门到精通最大的鸿沟,不…

2026/9/23 19:19:43

手写实现静电干扰滤波:性能优化实战

手写实现静电干扰滤波:性能优化实战 面试被问“如何消除高频噪声”时,你是否只能答出“加个电容”? 面试官追问“为什么加在输入端效果不好”,你瞬间大脑一片空白。 手写实现 一个高效的数字滤波算法,才是证明你懂原理的硬通货。…

2026/9/23 19:19:43

IPSO-BP风速预测:自适应变异粒子群优化BP神经网络实战

简介:面向风速预测中的非线性建模难题,该项目提出并实现了一种基于自适应变异粒子群优化BP神经网络(IPSO-BP)的完整方案,适用于新能源、气象及智能计算方向的工程师和MATLAB开发者。传统BP网络在训练中容易陷入局部极小…

2026/9/23 19:19:43

Python校园消费行为分析:DFM模型课设源码与结果集拆解

简介:基于Python的学生校园消费行为分析项目,是一份面向计算机专业课程设计与期末大作业的完整实战源码。项目经导师指导并通过评审(98分),源码均已本地编译调试,确保可运行,适合正在完成大作业…

2026/9/23 19:19:43

Nginx as a Reverse Proxy

“Nginx or a reverse proxy?” is a category error worth unpacking. Reverse proxy is a role; Nginx is one implementation of it. The useful questions are what the role actually requires, how Nginx implements it, and when a different implementation fits bett…

2026/9/23 19:14:43

手写实现阿卡利符文逻辑:3步搞定Stack Trace报错

手写实现阿卡利符文逻辑:3步搞定Stack Trace报错 盯着屏幕上一堆红色的 Stack Trace 报错信息,眼睛发酸,脑子发懵。你明明只是复制了一段网上找来的配置,或者在控制台里敲了一行看似正常的命令,结果系统直接崩给你看。那些…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码