composer validate仅校验composer.json语法与结构,不检查PHP代码;phpcs报告规范问题但不修复,php-cs-fixer自动修复格式问题但不处理语义规则,二者必须共存且需验证命令路径、配置文件名、版本及大小写等细节。

别指望 composer validate 能检查 PHP 代码规范——它只管 composer.json 写得对不对,和你的 PHP 文件完全无关。
phpcs 和 php-cs-fixer 不是二选一,而是必须共存
两者分工明确,缺一不可:
-
phpcs(squizlabs/php_codesniffer)只报告问题,比如命名不符合 PSR-1、缩进不是 4 空格、function (int $a)缺少空格等;它不改代码,适合 CI 卡点 -
php-cs-fixer(friendsofphp/php-cs-fixer)专注自动修复格式类问题(括号、空格、数组语法),但对语义规则(如变量命名、注释格式)无能为力 -
phpcbf是phpcs自带的修复工具,但 PHP 8.2+ 新语法支持滞后,容易把function (int $a)错修成function(int $a)(直接语法错误) - 实际项目应两个都装:
composer require --dev squizlabs/php_codesniffer friendsofphp/php-cs-fixer
装完怎么验证命令真能跑,而不是报 Could not open input file
常见失败不是没装,而是路径或配置错位:
- 进项目根目录,运行
./vendor/bin/phpcs -i:输出包含PSR12、Generic等才算规则加载成功;若为空,补装composer require --dev phpcompatibility/php-compatibility - 运行
./vendor/bin/php-cs-fixer --version:确认输出 ≥3.59.0(2026 年主流版本),旧版对#[\Deprecated]属性识别不准 - 检查配置文件名是否严格匹配:
phpcs.xml(不是.phpcs.xml或phpcs.xml.dist)、.php-cs-fixer.dist.php(不是php-cs-fixer.php),且必须放在项目根目录 -
phpcs --standard=psr12失败?大小写敏感,必须是PSR12;php-cs-fixer fix src/报 “Could not open input file”?多半是当前目录不对,或src/不存在
用 Composer 脚本调用时,为什么总显示成功,哪怕代码满屏报错
这是最隐蔽的坑:Composer 默认吞掉子命令的退出码,phpstan 找出 10 个错误,composer run stan 仍返回 0 —— CI 就这么悄无声息地通过了。
- 正确写法必须显式透传 exit code:
"cs": "@php vendor/bin/phpcs --standard=PSR12 $@" - Windows 下
$@不生效,得用%*,跨平台项目建议改用 shell 包装脚本(如bin/cs) - CI 中务必加
set -e或 GitHub Actions 的fail-fast: true,否则校验失败也继续执行 - 别在脚本里硬编码路径,用
${PWD}或./更安全;参数含空格时,用引号包裹整个参数段:composer run cs -- "src/My Class"
真正难的不是装上工具,而是让它们在 CI 里“说真话”:退出码不被吞、路径不写死、规则不漏配、PHP 8.3+ 新属性不误报——这些细节卡住一个,整条流水线就失去意义。


















