PHP项目怎么用静态分析

wen PHP项目 4

本文目录导读:

PHP项目怎么用静态分析

  1. 主流静态分析工具
  2. 完整项目配置示例
  3. CI/CD集成
  4. IDE集成
  5. 高级技巧
  6. 最佳实践建议

我来详细介绍PHP项目的静态分析方法:

主流静态分析工具

PHPStan(最推荐)

# 安装
composer require --dev phpstan/phpstan
# 基本使用
vendor/bin/phpstan analyse src --level=max
# 配置文件 phpstan.neon
parameters:
    level: 8
    paths:
        - src
    excludePaths:
        - tests
    tmpDir: tmp

Psalm(功能强大)

# 安装
composer require --dev vimeo/psalm
# 初始化
vendor/bin/psalm --init
# 运行
vendor/bin/psalm

PHP_CodeSniffer(代码规范)

# 安装
composer require --dev squizlabs/php_codesniffer
# 检查PSR-12规范
vendor/bin/phpcs --standard=PSR12 src/
# 自动修复
vendor/bin/phpcbf --standard=PSR12 src/

完整项目配置示例

项目结构

project/
├── src/
├── tests/
├── phpstan.neon
├── psalm.xml
├── phpcs.xml
└── composer.json

PHPStan 配置 (phpstan.neon)

parameters:
    level: 8
    paths:
        - src
    excludePaths:
        - src/Generated/*
        - src/Exceptions/*
    treatPhpDocTypesAsCertain: true
    checkMissingIterableValueType: false
    checkGenericClassInNonGenericObjectType: false
    ignoreErrors:
        - '#Method App\\Services\\SomeService::method\(\)#'

Psalm 配置 (psalm.xml)

<?xml version="1.0"?>
<psalm
    errorLevel="3"
    resolveFromConfigFile="true"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="https://getpsalm.org/schema/config"
>
    <projectFiles>
        <directory name="src" />
        <ignoreFiles>
            <directory name="vendor" />
            <file name="src/Legacy/legacy.php" />
        </ignoreFiles>
    </projectFiles>
    <issueHandlers>
        <MissingPropertyType errorLevel="info" />
        <PossiblyUnusedMethod>
            <errorLevel type="suppress">
                <directory name="src/Commands" />
            </errorLevel>
        </PossiblyUnusedMethod>
    </issueHandlers>
</psalm>

PHP-CS-Fixer(格式修复)

# 安装
composer require --dev friendsofphp/php-cs-fixer
# 配置文件 .php-cs-fixer.php
<?php
return (new PhpCsFixer\Config())
    ->setRules([
        '@PSR12' => true,
        '@PhpCsFixer' => true,
        'array_syntax' => ['syntax' => 'short'],
        'no_unused_imports' => true,
        'ordered_imports' => ['sort_algorithm' => 'alpha'],
        'single_quote' => true,
    ])
    ->setFinder(
        PhpCsFixer\Finder::create()
            ->in(__DIR__)
            ->exclude('vendor')
            ->exclude('storage')
    );

CI/CD集成

GitHub Actions 示例

# .github/workflows/static-analysis.yml
name: Static Analysis
on: [push, pull_request]
jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          tools: composer
      - name: Install dependencies
        run: composer install --prefer-dist --no-progress
      - name: Run PHPStan
        run: vendor/bin/phpstan analyse --no-progress
      - name: Run Psalm
        run: vendor/bin/psalm
      - name: Run PHP-CS-Fixer
        run: vendor/bin/php-cs-fixer fix --dry-run --diff

IDE集成

PhpStorm 配置

  1. 插件安装

    • PHPStan
    • Psalm
    • PHP Code Sniffer
  2. 配置PHPStan

    Settings → Tools → PHPStan
    - Path to executable: vendor/bin/phpstan
    - Level: 8
    - Run automatically: 50 (ms)
  3. 配置PSalm

    Settings → Tools → Psalm
    - Path to executable: vendor/bin/psalm
    - Run automatically: true

高级技巧

自定义优化器 (phpstan.neon)

services:
    - class: App\PHPStan\MyExtension
      tags:
        - phpstan.rules.rule

类型推断注释

/** @var array<string, User> $users */
$users = $this->getUsers();
/** @psalm-param array{name: string, age: int} $data */
function processData(array $data): void {}

构建工具集成

// composer.json
{
    "scripts": {
        "analyse": [
            "@php vendor/bin/phpstan analyse",
            "@php vendor/bin/psalm"
        ],
        "lint": [
            "@php vendor/bin/phpcs --standard=PSR12 src/",
            "@php vendor/bin/php-cs-fixer fix --dry-run"
        ],
        "check": [
            "@php vendor/bin/phpstan analyse",
            "@php vendor/bin/psalm",
            "@php vendor/bin/phpcs --standard=PSR12 src/"
        ]
    }
}

最佳实践建议

  1. 渐进式引入:从等级5开始,逐步提高到最高等级
  2. CI强制检查:提交前必须通过静态分析
  3. 增量修复:设置基线,先处理新代码,再逐步修复旧代码
  4. 团队统一:所有成员使用相同的配置文件
  5. 定期更新:保持工具版本最新
# 生成基线
vendor/bin/phpstan analyse --generate-baseline
# 只检查新增代码
vendor/bin/phpstan analyse --paths-file=phpstan-baseline.neon

这样配置后,你的PHP项目就能获得完整的静态分析能力,有效减少运行时错误,提高代码质量。

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