Composer安装PHP代码规范工具需按需选型:php-cs-fixer+nextcloud适用于简单格式化;ECS适合CI集成与强约束;slevomat需搭配phpcbf使用;stellarwp等须手动注册;配置文件不可混用,路径与加载机制必须匹配。

composer 安装 PHP 代码规范工具不是“装一个包就完事”,关键在于选对工具链、配对版本、明确用途——比如你只是想自动格式化数组缩进,用 php-cs-fixer + nextcloud/coding-standard 就够了;但要是团队要跑 CI 检查 + 自动修复 + 类结构强约束,就得组合 symplify/easy-coding-standard 和 symplify/coding-standard。
composer require --dev 装哪个包?先看你要解决什么问题
不同规范工具解决的不是同一类问题,强行混用反而增加维护成本:
-
slevomat/coding-standard:适合需要深度静态分析的项目,比如强制ParameterTypeHintSniff、禁止隐式数组创建。它依赖phpcs,但本身不带修复能力,得搭配phpcbf或另配php-cs-fixer -
symplify/easy-coding-standard(ECS):目标是“统一入口、可编程配置”,ecs.php里能写 PHP 逻辑控制规则启用条件,支持SetList::PSR_12这类预设,也支持跳过某目录下所有NoUnusedImportsFixer -
nextcloud/coding-standard:本质是给php-cs-fixer提供规则集,安装后必须配.php-cs-fixer.dist.php,不能直接被phpcs加载 -
stellarwp/coding-standards:强依赖phpcs≥ 3.4.2,且只在phpcs.xml里生效,composer require后不会自动注册到全局标准列表,得手动确认phpcs -i输出里有没有它
装完为什么 phpcs -i 看不到新标准?路径和加载机制没对上
很多标准(如 slevomat、stellarwp)靠 phpcs 自动扫描 vendor/ 下的 PHP_CodeSniffer/Standards 目录,但前提是包结构合规。常见失效原因:
-
slevomat/coding-standard的标准文件在vendor/slevomat/coding-standard/SlevomatCodingStandard,但它的composer.json没声明phpcodesniffer-standard类型,所以phpcs不会自动发现 —— 必须显式指定:phpcs --standard=vendor/slevomat/coding-standard/SlevomatCodingStandard -
escapestudios/symfony2-coding-standard已废弃,新版 Symfony 推荐直接用symfony-coding-standard(由php-cs-fixer维护),老包装了也白装 -
ghostwriter/coding-standard是命令行工具聚合器,不提供标准本身,composer ghostwriter:php-cs-fixer:run这类命令背后仍调用的是本地php-cs-fixer实例,跟phpcs无关
如何让 composer 脚本一键 check + fix?别硬套 vendor/bin/xxx
直接写 "scripts": {"cs:check": "phpcs ...", "cs:fix": "phpcbf ..."} 很容易出路径或参数错。更稳的做法是:
- 用 ECS:在
composer.json里定义"check-cs": "ecs check --ansi"和"fix-cs": "ecs check --fix --ansi",它会自动加载ecs.php配置,且默认启用并行检查 - 用 PHP CS Fixer:加
"cs:check": "php-cs-fixer fix --dry-run --diff",注意--dry-run不写成--dryrun,否则静默失败 - 避免混用
phpcs和php-cs-fixer的脚本名,比如phpcbf只能修phpcs规则中带修复能力的部分(如空格、括号),修不了php-cs-fixer的array_syntax这类规则
ruleset.xml vs ecs.php vs .php-cs-fixer.dist.php:别把配置文件放错位置
三个文件完全不兼容,不能互相替代:
立即学习“PHP免费学习笔记(深入)”;
-
ruleset.xml:仅phpcs/phpcbf读取,必须放在项目根目录或通过--standard=指定路径,内容是 XML 格式,<rule ref="SlevomatCodingStandard"></rule>这种写法只在这里有效 -
ecs.php:ECS 专用,返回ECSConfig对象,支持 PHP 表达式,比如->withPaths([__DIR__.'/src']),不能写 XML -
.php-cs-fixer.dist.php:PHP CS Fixer 专用,必须return new Config(),里面调$config->getFinder()设置路径,不能用withPaths()
最常被忽略的一点:ECS 的 ecs.php 里如果用了 SetList::PSR_12,它底层其实调的是 php-cs-fixer 规则,而不是 phpcs 的 PSR12 标准 —— 两者实现细节差异很大,比如数组换行判断逻辑就不一样。



















