PHP格式化首选PHPCS+PHP-CS-Fixer组合;需全局安装php-cs-fixer并配置VS Code的executablePath和config路径,配合项目级.php-cs-fixer.php规则文件及目录限制,确保保存时精准格式化。
VS Code 本身不带 PHP 代码格式化能力,必须靠扩展 + 外部工具协同。直接装 PHP Intelephense 或 PHP Tools 并不能自动格式化代码——它们主要做补全和跳转。真正起作用的是 php-cs-fixer(推荐)或 phpcbf(PHPCBF),前者规则更全、社区更新更勤、支持 PHP 8+ 新语法。
不能只靠扩展“启用格式化”,VS Code 必须能执行到 php-cs-fixer 命令。常见失败原因是路径没配对,或者用的是 Windows 的 .bat 包裹脚本但没加 .bat 后缀。
composer global require friendsofphp/php-cs-fixer
php-cs-fixer --version,如果报“command not found”,就把
~/.composer/vendor/bin(macOS/Linux)或 %USERPROFILE%\AppData\Roaming\Composer\vendor\bin(Windows)加进系统 PATHsettings.json,加这一行:"php.suggest.basic": false,
"php.format.enable": true,
"php.format.executablePath": "php-cs-fixer"(注意:不是
php-cs-fixer.bat,除非你明确用了 Windows 的批处理封装)光有工具不行,没规则等于没格式化。VS Code 调用 php-cs-fixer 时默认不读项目根目录下的配置文件,必须显式指定规则来源——否则它按内置默认规则跑,很可能和你们的 PSR-12 或自定义规范冲突。
.php-cs-fixer.php,内容示例:setRules([
'@PSR12' => true,
'array_syntax' => ['syntax' => 'short'],
'no_unused_imports' => true,
'ordered_imports' => true,
])
->setFinder(PhpCsFixer\Finder::create()->in(['src', 'tests']));
?>"php.format.args": ["--config=.php-cs-fixer.php"](路径是相对于打开的文件夹,不是当前文件)
.php_cs:这个旧名已被弃用,新版 php-cs-fixer 默认只认 .php-cs-fixer.php 或 .php-cs-fixer.dist.php
很多人开了 editor.formatOnSave 却发现 vendor/ 里的第三方代码也被动改了——这是因为 Finder 没限制范围,而 VS Code 默认把整个工作区都扔给格式化器。
.php-cs-fixer.php 中的 ->in([...]) 明确列出要处理的目录(如 src, app, tests),不要写 ->in('.')
"[php]": {
"editor.formatOnSave": true,
"editor.formatOnType": false,
"editor.formatOnPaste": false
}"php.format.args": ["--allow-risky=yes"] ——这个参数和目录控制无关,但开启后可能触发某些高风险规则,间接导致意外行为php-cs-fixer,且它读的是你写的 .php-cs-fixer.php 而不是默认规则。中间任何一环断掉,都会表现为“点了格式化但代码纹丝不动”或“格式后代码更乱了”。