必须用--dev而非全局安装,因项目级安装可锁定版本、避免跨项目冲突,且通过composer scripts统一调用保障ci一致性;全局安装易致path问题、权限混乱及所有项目被强制升级。

直接用 composer require --dev 装,别全局装,版本锁死在项目里才可靠。
为什么必须用 --dev 而不是全局安装
全局安装的 phpcs 或 php-cs-fixer 一旦升级,所有老项目都可能突然报错——比如 PHPCS 4.x 对 PHP 8.3 的 #[\Override] 属性支持不一致,CI 就会挂。项目级安装后,composer.json 里明确写着 "squizlabs/php_codesniffer": "^4.0",谁拉代码、谁跑 CI,行为都一样。
常见错误现象:
-
Could not open input file: phpcs:不是没装上,是系统 PATH 没包含全局 bin 目录 -
Permission denied(Linux/macOS):用sudo composer global require混淆了权限,后续所有global命令都会失败 - Windows 报
The system cannot find the path specified:%USERPROFILE%\AppData\Roaming\Composer\vendor\bin没加进环境变量
phpcs 和 php-cs-fixer 该装哪个
二者定位不同,不是二选一,而是互补:
-
phpcs(squizlabs/php_codesniffer):只检查,不改代码;适合 CI 卡点、PR 检查 -
php-cs-fixer(friendsofphp/php-cs-fixer):专注自动修复格式问题(空格、括号、数组语法等),但不处理语义类规范(如变量命名是否符合 PSR-1) - 实际项目建议两个都装:
composer require --dev squizlabs/php_codesniffer friendsofphp/php-cs-fixer
注意:phpcbf 是 phpcs 自带的修复工具,但能力弱于 php-cs-fixer,尤其对 PHP 8.2+ 新语法支持滞后,容易把 function (int $a) 错误修成 function(int $a)(少空格,直接语法错误)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
装完怎么验证能用
别急着跑检查,先确认命令路径和规则是否就位:
- 进项目根目录,运行
./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)、.php-cs-fixer.dist.php(不是phpcsfixer.php),且必须放在项目根目录
常见坑:phpcs --standard=psr12 失败——大小写敏感,必须是 PSR12;php-cs-fixer fix src/ 报 Could not open input file——多半是当前目录不在项目根,或 src/ 路径不存在。
怎么让命令变短、易记、可复用
靠 composer.json 的 scripts 字段,而不是改 shell PATH:
- 在
composer.json的scripts里加:"cs:check": "phpcs --standard=PSR12 --report=full src/", "cs:fix": "phpcbf --standard=PSR12 src/", "cs:fix-all": "php-cs-fixer fix --config=.php-cs-fixer.dist.php"
- 之后直接运行
composer run cs:check,不用记完整路径 - CI 脚本也统一用
composer run cs:check,避免因本地 PATH 差异导致流程失败
真正容易被忽略的是:PHPCS 默认不带任何规则,--standard= 不是可选项,是必填项;而 php-cs-fixer 如果找不到配置文件,会退回到极简内置规则,团队成员之间格式就完全不一致了。










