psr-12 强制生效需 php-cs-fixer 配合明确配置与流程嵌入:必须创建 .php-cs-fixer.php 并设 @psr12 规则、指定路径,再通过 composer scripts、ci 和 pre-commit 钩子集成检查,否则仅安装工具无效。

不能靠 Composer 本身强制,必须用 php-cs-fixer 配合明确配置和执行约束才真正生效。
为什么 composer require --dev 不等于 PSR-12 强制生效
执行 composer require --dev friendsofphp/php-cs-fixer 只是把工具装进 vendor/bin/,它不会自动扫描、不会报错、更不会阻断提交。项目里照样可以存在 publicfunction foo() 这种无空格写法,composer 完全不管。
- Composer 是包管理器,不是代码检查器
- 装了
php-cs-fixer≠ 启用了@PSR12规则集 - 没配置
.php-cs-fixer.php,工具默认只修极少数基础格式(比如行尾空格),PSR-12 的类声明、方法间距、括号换行等关键规则全不触发
必须手动创建 .php-cs-fixer.php 并限定作用域
文件名必须是 .php-cs-fixer.php(注意开头的点,不能拼成 php-cs-fixer.php 或 .php_cs),且必须放在项目根目录。否则 php-cs-fixer 直接忽略配置,退回到默认行为。
-
setRules(['@PSR12' => true])是启用整套 PSR-12 的最小开关,但单独写这行不够 - 必须配
setFinder()显式指定路径,例如:$finder->in(__DIR__ . '/src')->in(__DIR__ . '/tests'),否则它可能只扫当前目录下的单个文件 - 如果项目有
bin/或config/下的 PHP 文件也要纳入规范,得一并->in()
用 composer scripts 把检查变成不可绕过的动作
仅靠手动跑命令没人会坚持。把检查塞进 composer.json 的 scripts 里,并配合 CI 和 Git 钩子,才能形成实际约束。
- 加
"cs:check": "php-cs-fixer fix --dry-run --diff":本地运行时显示差异但不改文件,适合 PR 前自查 - CI 中必须用
./vendor/bin/php-cs-fixer fix --dry-run(绝对路径),避免因 PATH 或缓存导致漏检 - Git pre-commit 钩子里调
composer run cs:check,失败就中断提交——这才是“强制”的落地点 - 别用
--using-cache=false以外的缓存选项,Docker CI 环境里缓存路径经常失效,导致明明有错误却显示“Nothing to fix”
PSR-12 修复后仍报错?检查 phpcs 和 php-cs-fixer 的规则边界
运行 php-cs-fixer fix --rules=@PSR12 后,再用 phpcs --standard=PSR12 检查,仍可能报 PSR12.Methods.MethodDeclaration 类错误。这不是工具冲突,而是两者覆盖范围不同。
-
php-cs-fixer的@PSR12不处理部分语义级规则,比如函数参数是否每行一个、return后是否强制空格,这些归phpcs管 -
phpcs的PSR12标准会报错但不修复,所以你得保留它做最终校验,不能只依赖php-cs-fixer - 若想减少误报,可在
.php-cs-fixer.php里补一条:'no_superfluous_phpdoc_tags' => true,避免 PHPDoc 注解格式引发连锁问题
真正的强制,不在安装命令里,而在配置文件是否被读取、脚本是否被集成、检查是否嵌入到提交或 CI 流程中。少一个环节,PSR-12 就只是文档里的一行字。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











