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),仅供参考

相关新闻

checkbox 和 radio 组件

checkbox 和 radio 组件

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

2026/9/24 20:52:04 阅读更多 →
3分钟吃透电磁波谱图源码解析,面试不再卡壳

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

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

2026/9/24 20:52:03 阅读更多 →
Akka Streams mapConcat 操作符详解:集合扁平化与逐元素下游发射

Akka Streams mapConcat 操作符详解:集合扁平化与逐元素下游发射

Akka Streams mapConcat 操作符详解:集合扁平化与逐元素下游发射 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mirrors/a…

2026/9/24 20:51:48 阅读更多 →

最新新闻

Dart List详解:从增删改查到Flutter实战与踩坑

Dart List详解:从增删改查到Flutter实战与踩坑

把Dart的列表单独拎出来写一篇笔记,起初我是拒绝的——列表嘛,哪个语言没有,不就是增删改查。但真正在Flutter里写了几个页面之后,才发现这个想法太天真。列表在Dart里不只是数据结构,更是业务数据流转的主要载体&…

2026/9/24 20:52:01 阅读更多 →
使用 /add-test Skill 为 vscode-gitlens 生成单元测试与 E2E 测试:完整实战指南

使用 /add-test Skill 为 vscode-gitlens 生成单元测试与 E2E 测试:完整实战指南

开发工具版本控制 【免费下载链接】vscode-gitlens Supercharge Git inside VS Code and unlock untapped knowledge within each repository — Visualize code authorship at a glance via Git blame annotations and CodeLens, seamlessly navigate and explore Git reposit…

2026/9/24 20:52:01 阅读更多 →
GTX 1060跑35B大模型?llama.cpp+MoE架构的五大优化技巧

GTX 1060跑35B大模型?llama.cpp+MoE架构的五大优化技巧

GTX 1060算是一张被反复“宣判退役”但又始终活跃在玩家和折腾党手里的老卡。6GB显存在今天连个大点的游戏都喂不饱,更别说跑大模型了。但llama.cpp这个项目偏偏把门槛压得很低——低到让这张2016年的卡,能带着Qwen 3.6 35B A3B这样的35B参数级MoE模型跑…

2026/9/24 20:52:01 阅读更多 →
城市电网负荷预测实操:BP神经网络入门与避坑指南

城市电网负荷预测实操:BP神经网络入门与避坑指南

简介:基于MATLAB实现的BP神经网络城市电网负荷预测项目,面向电力系统、自动化及相关专业的本科及以上学习者,可用于课程设计、毕业设计或负荷预测算法的快速验证,从数据导入、网络训练到结果评估均有完整实现。资源共11个文件&…

2026/9/24 20:52:01 阅读更多 →
通用智能体直接能用吗?稳定性、成本与二次加工实战指南

通用智能体直接能用吗?稳定性、成本与二次加工实战指南

我最近被问得最多的一个问题,就是标题这句:“现在的通用智能体这么强,直接用不行吗?” 每次去企业聊AI落地,演示完各家通用智能体平台的能力之后,业务方基本都会冒出这句话。语气里带着兴奋,也带…

2026/9/24 20:52:00 阅读更多 →
考虑交通流量的电动汽车充电站规划Matlab实现与优化

考虑交通流量的电动汽车充电站规划Matlab实现与优化

搞电动汽车充电站规划的人,十有八九都会被一个问题卡住:明明建了不少站,用户还是觉得不好用,运营商还是觉得不赚钱。问题出在哪?出在“站是拍脑袋定的”。真正靠谱的做法,应该是让数据说话,尤其…

2026/9/24 20:51:00 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →