本文目录导读:

在 PHP 中使用静态分析工具是提高代码质量、发现潜在 bug 的重要手段,以下是常用的工具及使用方法:
主流静态分析工具
PHPStan(最流行)
# 安装(推荐全局安装) composer global require phpstan/phpstan # 或项目内安装 composer require --dev phpstan/phpstan # 运行分析 vendor/bin/phpstan analyse src --level=5 # 生成配置文件 vendor/bin/phpstan init
配置文件 phpstan.neon:
parameters:
level: 5 # 分析级别 0-9,越高越严格
paths:
- src
excludePaths:
- tests
checkMissingIterableValueType: true
checkGenericClassInNonGenericObjectType: true
Psalm(Vimeo 开发)
# 安装 composer require --dev vimeo/psalm # 初始化 vendor/bin/psalm --init # 运行 vendor/bin/psalm # 配置文件 psalm.xml
Php Insights(代码质量与架构)
composer require --dev nunomaduro/phpinsights # 运行 vendor/bin/phpinsights
集成到 IDE
VS Code
// .vscode/settings.json
{
"phpstan.enabled": true,
"phpstan.run": "onSave",
"phpstan.level": 5
}
PhpStorm
- 安装 PHPStan 插件
- 配置路径和级别
CI/CD 集成示例
GitHub Actions
name: Static Analysis
on: [push, pull_request]
jobs:
static-analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
tools: composer, phpstan
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Run PHPStan
run: vendor/bin/phpstan analyse src --level=5 --no-progress
GitLab CI
phpstan:
stage: test
script:
- composer install
- vendor/bin/phpstan analyse src --level=5
实际使用案例
示例问题代码 src/UserService.php:
<?php
class UserService
{
private $db;
public function __construct($db)
{
$this->db = $db;
}
public function getUser($id)
{
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
$user = $stmt->fetch();
// PHPStan 会检测到 $user 可能为 false
return $user->name; // 错误:访问 false 的属性
}
}
修复后:
<?php
class UserService
{
private Database $db;
public function __construct(Database $db)
{
$this->db = $db;
}
public function getUser(int $id): ?User
{
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
$result = $stmt->fetch();
if (!$result) {
return null;
}
return new User($result);
}
}
高级技巧
自定义通用返回类型
/**
* @template T
* @param class-string<T> $class
* @return T
*/
function createInstance(string $class) {
return new $class();
}
忽略特定行
$data = riskyFunction(); // @phpstan-ignore-next-line $result = $data->property;
与 PHPUnit 结合
# 运行 PHPStan 后运行测试 vendor/bin/phpstan analyse src --level=5 && vendor/bin/phpunit
最佳实践建议
- 从低级别开始:先从 level 0-1 开始,逐步提升
- 定期运行:每次提交前运行
- 集成到 CI:阻止低质量代码合并
- 团队统一:统一配置文件和级别
常用命令汇总
# PHPStan vendor/bin/phpstan analyse src --level=5 --memory-limit=1G vendor/bin/phpstan analyse --debug # 调试模式 # 基线模式(记录现有错误) vendor/bin/phpstan analyse src --generate-baseline # Psalm vendor/bin/psalm --show-info=true vendor/bin/psalm --taint-analysis # 安全分析 # 并行运行 vendor/bin/phpstan analyse src --parallel --processes=4
这些工具能显著提升代码质量,建议在项目中尽早引入。