本文目录导读:

- PHP-CS-Fixer(代码风格修复)
- PHP_CodeSniffer 自动修复
- Rector(规则引擎自动升级/重构)
- PHPStan(静态分析,部分自动修复)
- 自动化集成到 CI/CD
- 集成到 IDE
- 自定义自动化修复脚本
- 完整工作流程建议
在 PHP 中自动化修复代码,主要有以下几个方向和工具:
PHP-CS-Fixer(代码风格修复)
最流行的代码风格自动化修复工具:
# 安装 composer require --dev friendsofphp/php-cs-fixer # 创建配置文件 .php-cs-fixer.php
.php-cs-fixer.php 配置示例:
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__ . '/src')
->in(__DIR__ . '/tests')
->exclude('vendor');
return (new PhpCsFixer\Config())
->setRules([
'@PSR12' => true,
'array_syntax' => ['syntax' => 'short'],
'no_unused_imports' => true,
'ordered_imports' => ['sort_algorithm' => 'alpha'],
'single_quote' => true,
'trailing_comma_in_multiline' => true,
])
->setFinder($finder);
运行修复:
# 修复所有文件 vendor/bin/php-cs-fixer fix # 指定目录 vendor/bin/php-cs-fixer fix src/ # 测试模式(不修改文件) vendor/bin/php-cs-fixer fix --dry-run --diff
PHP_CodeSniffer 自动修复
# 安装 composer require --dev squizlabs/php_codesniffer # 自动修复 vendor/bin/phpcbf --standard=PSR12 src/ # 使用 WordPress 标准 vendor/bin/phpcbf --standard=WordPress src/
Rector(规则引擎自动升级/重构)
用于自动化代码重构和升级:
# 安装 composer require --dev rector/rector # 创建 rector.php 配置文件
rector.php 配置:
<?php
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\SetList;
return RectorConfig::configure()
->withPaths([
__DIR__ . '/src',
])
->withSets([
SetList::CODE_QUALITY,
SetList::DEAD_CODE,
SetList::PHP_80,
]);
运行:
# 预览更改 vendor/bin/rector process --dry-run # 实际执行修复 vendor/bin/rector process
PHPStan(静态分析,部分自动修复)
# 安装 composer require --dev phpstan/phpstan # 运行分析 vendor/bin/phpstan analyse src --level=8
创建 phpstan.neon 配置:
parameters:
level: 8
paths:
- src
reportUnmatchedIgnoredErrors: false
自动化集成到 CI/CD
创建 composer.json 脚本:
{
"scripts": {
"fix": [
"@php vendor/bin/php-cs-fixer fix",
"@php vendor/bin/phpcbf --standard=PSR12 src/"
],
"check": [
"@php vendor/bin/php-cs-fixer fix --dry-run --diff",
"@php vendor/bin/phpstan analyse src --level=8"
]
}
}
GitHub Actions 示例:
name: PHP Quality
on: [push, pull_request]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install
- name: Auto-fix code style
run: composer fix
- name: Check changes
run: git diff --exit-code
集成到 IDE
VS Code 配置(settings.json):
{
"php-cs-fixer.executablePath": "${workspaceFolder}/vendor/bin/php-cs-fixer",
"php-cs-fixer.rules": "@PSR12",
"[php]": {
"editor.defaultFormatter": "bmewburn.vscode-intelephense-client",
"editor.formatOnSave": true
}
}
PhpStorm 配置:
- 设置 → 工具 → 文件监视器
- 添加 PHP-CS-Fixer 监视器
- 设置为保存时自动修复
自定义自动化修复脚本
<?php
// fix.php - 自定义修复脚本
class AutoFixer {
private array $files = [];
public function run(): void {
$this->collectFiles();
$this->fixClassNames();
$this->fixImports();
}
private function collectFiles(): void {
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('src')
);
foreach ($iterator as $file) {
if ($file->getExtension() === 'php') {
$this->files[] = $file->getPathname();
}
}
}
private function fixClassNames(): void {
foreach ($this->files as $file) {
$content = file_get_contents($file);
// 修复命名空间大小写
$content = preg_replace(
'/namespace\s+([a-zA-Z0-9_\\\]+);/',
function($matches) {
return 'namespace ' . str_replace('\\', '\\', ucwords($matches[1], '\\')) . ';';
},
$content
);
file_put_contents($file, $content);
}
}
private function fixImports(): void {
// 移除未使用的 use 语句等
}
}
(new AutoFixer())->run();
完整工作流程建议
# 开发流程建议 composer check # 检查问题 composer fix # 自动修复 vendor/bin/rector process --dry-run # 预览重构 vendor/bin/rector process # 执行重构 composer test # 运行测试确认无破坏
核心建议:
- 将修复工具配置到 CI 中自动检查
- 在 IDE 中启用保存时自动格式化
- 定期运行 Rector 升级代码
- 使用 Git 分支保护,merge 前必须通过质量检查
选择工具时,从 PHP-CS-Fixer 开始最简单,Rector 适合项目升级,PHPStan 用于发现潜在问题而不是自动修复。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播