全局安装php-cs-fixer需先将Composer bin目录加入PATH,否则提示“command not found”;验证用php-cs-fixer --version;推荐全局开发、本地CI;配置文件为.php-cs-fixer.php,须设setFinder并exclude('vendor');运行前必加--dry-run和--diff预览。

用 Composer 全局安装 php-cs-fixer
直接运行 composer global require friendsofphp/php-cs-fixer 即可,但前提是你的 ~/.composer/vendor/bin(Linux/macOS)或 %USERPROFILE%\AppData\Roaming\Composer\vendor\bin(Windows)已加入系统 PATH。没加的话,命令会提示“command not found”,不是安装失败,而是找不到可执行文件。
验证是否生效:终端执行 php-cs-fixer --version。如果报错说找不到命令,别重装,先检查 PATH 是否包含 Composer 的 bin 目录。
本地项目安装 vs 全局安装的区别
项目级安装用 composer require --dev friendsofphp/php-cs-fixer,生成的二进制在 vendor/bin/php-cs-fixer。好处是版本锁定、团队一致;坏处是每次都要写相对路径或加 ./vendor/bin/php-cs-fixer,CI/CD 脚本里容易漏掉 ./vendor/bin/ 前缀。
全局安装更方便日常使用,但要注意:多个项目依赖不同版本时,全局只有一个版本,可能不兼容旧项目规则。建议主力开发用全局,CI 流水线用本地安装 + vendor/bin/php-cs-fixer 显式调用。
立即学习“PHP免费学习笔记(深入)”;
- 本地安装后,
php-cs-fixer不会自动注册为全局命令 - 全局安装后,升级只需
composer global update friendsofphp/php-cs-fixer -
--dev参数必须加,它不是运行时依赖,只是开发工具
配置 .php-cs-fixer.php 文件常见写法
配置文件名必须是 .php-cs-fixer.php(注意开头的点),放在项目根目录。内容返回一个 PhpCsFixer\Config 实例,不是 JSON 或 YAML。
最简可用配置示例:
return PhpCsFixer\Config::create()
->setRules([
'@PSR12' => true,
'array_syntax' => ['syntax' => 'short'],
'no_unused_imports' => true,
])
->setFinder(PhpCsFixer\Finder::create()
->in(__DIR__)
->exclude('vendor')
->name('*.php')
)
;
注意点:
-
setFinder()必须显式设置,否则默认只处理当前目录下的 PHP 文件,不会递归 -
exclude('vendor')很关键,否则会尝试格式化第三方包,极慢且无意义 - 规则名如
@PSR12是预设集,array_syntax是单条规则,参数结构要看官方文档对应规则页 - 配置文件里不能用短数组语法
[]如果项目 PHP 版本低于 5.4 —— 但你真还在用 PHP 5.4 以下?
运行 fix 时 --dry-run 和 --diff 参数别漏掉
首次在项目中运行前,务必先加 --dry-run 看哪些文件会被改、改多少行,避免误操作覆盖未提交的修改。加上 --diff 可以直接看到具体差异(类似 git diff),比纯统计更有用。
常用组合:
-
php-cs-fixer fix --dry-run --diff:预览改动 -
php-cs-fixer fix --verbose:显示每个文件的处理状态,卡住时能定位是哪个文件出问题 -
php-cs-fixer fix src/ --rules=@Symfony:只处理src/目录,且只启用 @Symfony 规则集
如果你发现某次 fix 后 Git 提交了大量空格或换行变化,大概率是配置里没设 'line_ending' => "\n" 或系统换行符和规则不一致,尤其 Windows 和 macOS 混合开发时。











