PHP 怎么用静态分析工具

wen PHP项目 2

本文目录导读:

PHP 怎么用静态分析工具

  1. 主流静态分析工具
  2. 集成到 IDE
  3. CI/CD 集成示例
  4. 实际使用案例
  5. 高级技巧
  6. 最佳实践建议
  7. 常用命令汇总

在 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

最佳实践建议

  1. 从低级别开始:先从 level 0-1 开始,逐步提升
  2. 定期运行:每次提交前运行
  3. 集成到 CI:阻止低质量代码合并
  4. 团队统一:统一配置文件和级别

常用命令汇总

# 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

这些工具能显著提升代码质量,建议在项目中尽早引入。

抱歉,评论功能暂时关闭!