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 向けの公式拡張(larastan、phpstan-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 Checker は composer.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.json の scripts にまとめておくことで、ローカルでも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 を追加していくのが現実的なアプローチです。