PHP-CS-Fixer v3.0+完全支持PHP 8.1,v2.x已停止维护且在PHP 8.1下报错;需通过composer升级至v3,并配置PSR-12及modernize_types等规则以支持枚举、readonly等新特性。

PHP-CS-Fixer 在 PHP 8.1 环境下能正常运行,但需注意版本兼容性——PHP-CS-Fixer v3.0+ 完全支持 PHP 8.1,而 v2.x 已停止维护且不推荐用于新项目。
确认 PHP-CS-Fixer 版本与 PHP 8.1 兼容
旧版 php-cs-fixer(v2)在 PHP 8.1 下会报错,典型现象是:Fatal error: Uncaught Error: Call to undefined method PhpCsFixer\Tokenizer\Tokens::isChanged() 或直接退出并返回非零状态码。
- 检查当前版本:
./vendor/bin/php-cs-fixer --version,输出应类似v3.56.0 - 若为 v2.x(如
v2.19.3),必须升级:composer update friendsofphp/php-cs-fixer --with-all-dependencies - v3 要求最低 PHP 版本为 7.4,
PHP 8.1属于完全支持范围,无需额外 polyfill
用 .php-cs-fixer.dist.php 配置 PSR-12 + PHP 8.1 特性
PHP 8.1 引入了枚举(enum)、只读属性(readonly)等语法,PHP-CS-Fixer v3 默认能识别,但需启用对应规则才能自动格式化。
- 启用
@PSR12是基础,但不够:它不处理enum的换行、readonly声明顺序等新特性 - 补充关键规则:
'modernize_types' => true(自动将array替换为int[]等)、'native_function_invocation' => ['include' => ['@all']](统一函数调用风格) - 排除
vendor和node_modules,避免扫描第三方代码引发解析错误 - 示例配置片段:
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__ . '/src')
->name('*.php')
->notName('*.blade.php')
->exclude('vendor')
->exclude('node_modules');
return (new PhpCsFixer\Config())
->setRules([
'@PSR12' => true,
'modernize_types' => true,
'native_function_invocation' => ['include' => ['@all']],
'declare_strict_types' => true, // 强制 strict_types=1,适配 PHP 8.1 类型安全
'no_unused_imports' => true,
])
->setFinder($finder)
->setUsingCache(true);
修复命令要加 --dry-run 先验证,尤其对 PHP 8.1 新语法
直接 fix 可能误改 enum 或 readonly 结构,因为部分规则在 v3.50 前存在边界 case 处理缺陷(如 enum 中的 case 缩进)。
立即学习“PHP免费学习笔记(深入)”;
- 先执行检查:
./vendor/bin/php-cs-fixer check --dry-run --diff,观察输出是否包含enum或readonly相关变更 - 若 diff 显示异常(如把
enum Status拆成多行或删掉case后的冒号),说明当前规则组合不稳妥,应回退到@PSR12单独启用 - 真正修复时,建议限定路径:
./vendor/bin/php-cs-fixer fix src/MyEnum.php,而非整个项目,避免批量误伤
CI 流程中需显式指定 PHP 版本和缓存路径
GitHub Actions 或 GitLab CI 中,PHP-CS-Fixer 默认可能复用旧缓存或误用系统 PHP,导致 PHP 8.1 特性未被识别。
- 在 workflow 中明确指定 PHP 版本:
uses: shivammathur/setup-php@v2+php-version: '8.1' - 缓存路径不能写死:
cache-key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}-csfixer,否则不同 PHP 版本共用缓存会出错 - CI 中禁用 risky 规则:
--allow-risky=no,因为PHP 8.1下部分 risky 修复(如自动类型推导)尚未稳定
最易被忽略的是:PHP 8.1 的 enum 和 readonly 在 PHP-CS-Fixer 中默认不触发修复,除非你手动启用相关规则;而一旦启用,又容易因版本差异导致格式错乱——务必先 --dry-run,再小范围实测。



















