PHP プロジェクトが成長するにつれ、コードの一貫性・型安全性・テストカバレッジは自然に劣化していきます。これらを機械的に担保するのが品質保証ツールの役割です。本記事では、Linter・静的解析・テストフレームワーク・カバレッジ・セキュリティ解析・自動リファクタリングの各カテゴリから主要ツールを取り上げ、インストールから設定例まで実践的に解説します。

Linter / フォーマッター

PHP_CodeSniffer(PHPCS)

PHP_CodeSniffer は PSR-1・PSR-2・PSR-12 などのコーディング規約に沿っているかをチェックするツールです。違反箇所を報告するだけでなく、phpcbf コマンドで自動修正も行えます。

composer require --dev squizlabs/php_codesniffer
vendor/bin/phpcs --standard=PSR12 src/
vendor/bin/phpcbf --standard=PSR12 src/   # 自動修正

プロジェクトルートに phpcs.xml を置くことで、チェック対象や除外パターンを管理できます。

<?xml version="1.0"?>
<ruleset name="MyProject">
    <rule ref="PSR12"/>
    <file>src</file>
    <exclude-pattern>*/vendor/*</exclude-pattern>
</ruleset>

PHP CS Fixer

PHP CS Fixer は PHPCS より豊富なルールセットを持つ自動フォーマッターです。@PSR12@Symfony@PHP80Migration といったプリセットを組み合わせることで、コードスタイルと PHP バージョン移行を同時に扱えます。

composer require --dev friendsofphp/php-cs-fixer
vendor/bin/php-cs-fixer fix src/ --rules=@PSR12

.php-cs-fixer.php で細かいルールを制御できます。

<?php
return (new PhpCsFixer\Config())
    ->setRules([
        '@PSR12' => true,
        'array_syntax' => ['syntax' => 'short'],
        'ordered_imports' => true,
    ])
    ->setFinder(PhpCsFixer\Finder::create()->in(__DIR__ . '/src'));

Pint(Laravel 公式フォーマッター)

Pint は Laravel チームが提供する PHP CS Fixer のラッパーです。設定なしですぐに使える点が特徴で、Laravel プロジェクトのデフォルトフォーマッターとして採用されています。

composer require --dev laravel/pint
vendor/bin/pint
vendor/bin/pint --test   # 修正せず差分だけ確認

PHP Parallel Lint

PHP Parallel Lint は PHP ファイルの構文エラーを並列で高速検出するツールです。CI の最初のステップに組み込むことで、構文レベルのミスを即座に検知できます。

composer require --dev php-parallel-lint/php-parallel-lint
vendor/bin/parallel-lint src/

静的解析 / 型チェック

PHPStan

PHPStan は PHP の静的解析ツールの中でも最もよく使われています。レベル 0〜9 の段階的な厳格度が用意されており、既存プロジェクトに少しずつ型安全性を導入できます。

composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src/ --level=5

phpstan.neon で設定を管理します。

parameters:
    level: 5
    paths:
        - src
    ignoreErrors:
        - '#Call to an undefined method [a-zA-Z0-9\\_]+::someMethod\(\)#'

Laravel・Doctrine・Symfony 向けの公式拡張(larastanphpstan-doctrine など)も充実しています。

Psalm

Psalm は Vimeo が開発した静的解析ツールで、型解析に加えてセキュリティ診断(taint analysis)も行えます。PHPDoc アノテーションの精度が高く、大規模なコードベースでも安定して動作します。

composer require --dev vimeo/psalm
vendor/bin/psalm --init src/ 3   # エラーレベル 3 で初期化
vendor/bin/psalm

Phan

Phan は大規模プロジェクト向けの静的解析ツールで、PHP 拡張との相互運用性が高いのが特徴です。php-ast 拡張を使うことで解析速度を大幅に向上させられます。

composer require --dev phan/phan
vendor/bin/phan --init
vendor/bin/phan

テストフレームワーク

PHPUnit

PHPUnit は PHP のデファクトスタンダードなテストフレームワークです。アサーション・モック・データプロバイダ・カバレッジレポートを標準で備えています。

composer require --dev phpunit/phpunit
vendor/bin/phpunit tests/

基本的なテストクラスの例です。

<?php
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase
{
    public function testAdd(): void
    {
        $calc = new Calculator();
        $this->assertSame(5, $calc->add(2, 3));
    }

    public function testDivideByZero(): void
    {
        $this->expectException(\DivisionByZeroError::class);
        (new Calculator())->divide(1, 0);
    }
}

phpunit.xml でテスト対象ディレクトリやカバレッジ設定を管理します。

Pest

Pest は PHPUnit のラッパーとして動作するモダンなテストフレームワークです。クロージャベースの記法により、テストコードをより簡潔に書けます。Laravel プロジェクトでの採用率が高まっています。

composer require --dev pestphp/pest --with-all-dependencies
vendor/bin/pest --init
<?php
it('adds two numbers', function () {
    expect((new Calculator())->add(2, 3))->toBe(5);
});

test('divides correctly', function () {
    expect((new Calculator())->divide(10, 2))->toBe(5.0);
});

Infection(ミューテーションテスト)

Infection はミューテーションテストを実行するツールです。テストコードの一部を意図的に変化(ミューテーション)させ、テストがそれを検出できるかを検証します。カバレッジが高くても「意味のあるテスト」かどうかを評価できます。

composer require --dev infection/infection
vendor/bin/infection --threads=4

ミューテーションスコアが低い場合は、アサーションが不十分なテストを疑いましょう。

カバレッジ

Xdebug + PHPUnit

Xdebug は PHP の定番デバッグ拡張で、コードカバレッジの計測にも使われます。

XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-html coverage/

HTML レポートが coverage/ に生成され、行・分岐・関数ごとのカバレッジを確認できます。

PCOV

PCOV は Xdebug より軽量なカバレッジ専用ドライバです。CI 環境ではデバッグ機能が不要なため、PCOV を使うとカバレッジ計測のオーバーヘッドを削減できます。

pecl install pcov
php -d extension=pcov.so vendor/bin/phpunit --coverage-text

セキュリティ解析

Local PHP Security Checker

Local PHP Security Checkercomposer.lock を解析し、既知の脆弱性を含む依存パッケージを検出します。

curl -L https://github.com/fabpot/local-php-security-checker/releases/latest/download/local-php-security-checker_linux_amd64 -o local-php-security-checker
chmod +x local-php-security-checker
./local-php-security-checker

CI に組み込み、定期的に依存関係の脆弱性をチェックすることが推奨されます。

Roave Security Advisories

Roave Security Advisories は Composer の依存関係レベルで既知の脆弱なパッケージのインストールを防ぐライブラリです。Composer の conflict 宣言を利用しており、インストールするだけで効果があります。

composer require --dev roave/security-advisories:dev-latest

自動リファクタリング

Rector

Rector は PHP コードの自動リファクタリングを行うツールで、PHP バージョンアップ(例: PHP 7 → 8)やコードの近代化(array()[]、プロパティ型宣言の追加など)を自動化します。

composer require --dev rector/rector
vendor/bin/rector init
vendor/bin/rector process src/ --dry-run   # 変更のプレビュー
vendor/bin/rector process src/             # 実際に適用

rector.php でルールセットを指定します。

<?php
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
use Rector\Set\ValueObject\SetList;

return RectorConfig::configure()
    ->withPaths([__DIR__ . '/src'])
    ->withSets([
        LevelSetList::UP_TO_PHP_83,
        SetList::CODE_QUALITY,
        SetList::DEAD_CODE,
    ]);

CI 統合のヒント

Composer scripts での組み合わせ

composer.jsonscripts にまとめておくことで、ローカルでもCIでも同じコマンドで実行できます。

{
    "scripts": {
        "lint": "vendor/bin/parallel-lint src/",
        "cs": "vendor/bin/phpcs",
        "cs:fix": "vendor/bin/phpcbf",
        "stan": "vendor/bin/phpstan analyse",
        "test": "vendor/bin/phpunit",
        "test:coverage": "XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-text",
        "check": [
            "@lint",
            "@cs",
            "@stan",
            "@test"
        ]
    }
}

composer check 一発でフル検証が走ります。

GitHub Actions 設定例

name: PHP Quality Checks

on: [push, pull_request]

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: xdebug
          coverage: xdebug

      - name: Install dependencies
        run: composer install --no-interaction --prefer-dist

      - name: Lint
        run: vendor/bin/parallel-lint src/

      - name: Code style
        run: vendor/bin/phpcs

      - name: Static analysis
        run: vendor/bin/phpstan analyse

      - name: Tests
        run: vendor/bin/phpunit --coverage-text

まとめ

PHP の品質保証ツールを整理するとポイントは以下の通りです。

  • 構文チェック: PHP Parallel Lint でまず構文エラーを排除する
  • フォーマット: PHP CS Fixer または Pint でスタイルを統一する
  • 静的解析: PHPStan をレベル 1 から導入し、段階的に厳格化する
  • テスト: PHPUnit または Pest でユニットテストを整備し、Infection で品質を検証する
  • セキュリティ: Roave Security Advisories を Composer に組み込み、定期的に Security Checker を走らせる
  • 自動リファクタリング: Rector で PHP バージョンアップとコード近代化を自動化する
  • CI: composer scripts にまとめて GitHub Actions で毎コミット実行する

すべてを一度に導入する必要はありません。まず PHPStan + PHPUnit + PHP CS Fixer の三点セットを CI に組み込むところから始め、プロジェクトの成熟度に応じて Rector や Infection を追加していくのが現実的なアプローチです。