PSR-12强制所有控制结构(if/foreach等)必须使用大括号,左括号与关键字同行,禁用冒号语法,并通过PHP-CS-Fixer自动化修复与CI卡点保障执行。

if/foreach 语句必须带大括号,哪怕只有一行
PHP 8.2 不强制要求大括号,但省略后一旦后续补语句就必然出错——比如加个 log() 或 throw new Exception(),没括号的 if 只管第一行,第二行无条件执行。团队里有人写 if ($x) echo $y;,有人写 if ($x) { echo $y; },合并代码时极易引入逻辑漏洞。
统一做法就是:所有控制结构(if、elseif、else、for、foreach、while)后面必须跟大括号,无论单行还是多行。
- 不接受
if ($x) return true;这类写法 - 允许
if ($x) { return true; },且左括号必须与if同行(PSR-12 要求) - 空块也得写全:
if ($x) { },不能省略成if ($x);
别混用冒号语法和大括号语法
冒号语法(if ($x): ... endif;)和大括号语法在同一个项目里共存,会显著增加阅读负担,尤其嵌套时容易漏掉 endif 或错配缩进。PHP 8.2 对两种语法都支持,但 PSR-12 明确只推荐大括号风格。
真实踩坑场景:
立即学习“PHP免费学习笔记(深入)”;
- 模板文件里用了冒号语法,但控制器层又用大括号,新人改代码时复制粘贴错风格
- IDE 自动格式化只认大括号,导致冒号块被错误缩进或换行
- 静态分析工具(如 PHPStan)对冒号语法的支持弱于大括号,类型推导可能失效
建议全项目禁用冒号语法,连 foreach 和 switch 都统一用大括号。
用 PHP-CS-Fixer 自动修复并卡 CI 流程
靠人工检查“有没有漏大括号”不可靠,必须自动化。PHP-CS-Fixer 的 braces 规则能强制所有控制结构带括号,配合 control_structure_continuation_position 统一换行位置。
关键配置片段(.php-cs-fixer.php):
return (new PhpCsFixer\Config())
->setRules([
'braces' => [
'allow_single_line_closure' => true,
],
'control_structure_continuation_position' => ['position' => 'next_line'],
])
- 本地开发:IDE 安装 PHP-CS-Fixer 插件,保存时自动格式化
- Git 提交前:用 pre-commit hook 跑 fixer,不通过不准提交
- CI 流程(如 GitHub Actions):跑
php-cs-fixer --dry-run,有差异就失败
这样从编码、提交到集成,三层卡住风格不一致。
PHP8.2+ 的只读类和联合类型不改变括号规则
有人误以为 PHP 8.2 引入了 readonly class 或联合类型(如 string|int)后,可以放松括号约束——其实完全无关。类型声明再严格,也不能替代结构清晰性。
比如这个合法但危险的写法:
if ($user instanceof User&ActiveInterface) $user->activate();
它语法正确,但没括号、没换行、没空格,可读性为零。PHP 8.2 的类型能力是增强表达力,不是降低结构要求。
真正容易被忽略的是:团队在升级 PHP 版本后,只关注新特性写法,却放任旧有括号风格继续蔓延。统一括号这事,和版本无关,只和协作成本有关。



















