Appearance
PHPStan実行ガイド
目的
このドキュメントは、プロジェクトでPHPStanを使用して静的解析を実行する方法を初心者向けに説明します。
対象読者
- 静的解析ツールを初めて使用する開発者
- このプロジェクトに新しく参加する開発者
- コードの品質向上に関心のある開発者
PHPStanとは
PHPStanの役割と目的
PHPStanは、PHPコードの静的解析ツールです。コードを実際に実行せずに、以下の問題を検出します:
- 型エラー: 型の不一致や未定義の変数・プロパティ
- 未使用のコード: 使用されていない変数やメソッド
- 潜在的なバグ: null参照、配列の範囲外アクセスなど
- コードの品質問題: 複雑な条件分岐、循環的複雑度など
静的解析のメリット
- 実行前のバグ検出: コードを実行する前に問題を発見できる
- リファクタリングの安全性: 型情報を活用して安全にコードを変更できる
- IDEサポートの向上: 型情報が明確になり、IDEの補完が向上する
- ドキュメントとしての役割: 型情報がコードの仕様を明確にする
このプロジェクトでの設定
このプロジェクトでは、PHPStan Level 4を使用しています。Levelは0(最も緩い)から9(最も厳しい)まであり、数字が大きいほど多くの問題を検出します。
環境セットアップ
前提条件
- PHP: 8.3以上
- Composer: 依存関係管理ツール
依存関係のインストール方法
プロジェクトルートディレクトリで以下のコマンドを実行してください:
bash
# 開発依存関係を含めてインストール
composer install
# または、setupスクリプトを使用
composer setupこれにより、PHPStan 1.10以上とWordPress用の拡張機能(szepeviktor/phpstan-wordpress)がインストールされます。
実行方法
基本コマンド
すべてのコードを解析
bash
composer analyseまたは、PHPStanを直接実行:
bash
vendor/bin/phpstan analyse --memory-limit=1G --configuration=config/phpstan.neonメモリ制限を調整して実行
メモリ不足が発生する場合:
bash
composer analyse -- --memory-limit=2Gまたは、直接実行:
bash
vendor/bin/phpstan analyse --memory-limit=2G --configuration=config/phpstan.neon特定のディレクトリを解析
特定のディレクトリのみを解析する場合:
bash
vendor/bin/phpstan analyse --memory-limit=1G --configuration=config/phpstan.neon core_src/Service特定のファイルを解析
特定のファイルのみを解析する場合:
bash
vendor/bin/phpstan analyse --memory-limit=1G --configuration=config/phpstan.neon core_src/Service/DailyArticleResultService/DailyArticleResultService.phpデバッグモードで実行
詳細な情報を表示する場合:
bash
vendor/bin/phpstan analyse --memory-limit=1G --configuration=config/phpstan.neon --debug設定の説明
config/phpstan.neon の設定内容
プロジェクトの config/phpstan.neon ファイルで、PHPStanの動作を設定しています。
主要な設定項目
解析レベル
yaml
parameters:
level: 4- Level 4: 中程度の厳格さ
- 型の不一致、未定義の変数・プロパティ、null参照などを検出
解析対象パス
yaml
parameters:
paths:
- ../connector.php
- ../core_src以下のパスが解析対象です:
connector.php- WordPress統合メインファイルcore_src/- メインアプリケーションディレクトリ
ブートストラップファイル
yaml
parameters:
bootstrapFiles:
- ../vendor/autoload.php
- ../core_src/vendor/autoload.php
- ../vendor/php-stubs/wordpress-stubs/wordpress-stubs.php
- phpstan_bootstrap.php以下のファイルが読み込まれます:
- Composerオートローダー(ルートとcore_src)
- WordPress関数のスタブ(
php-stubs/wordpress-stubs) - カスタムブートストラップ(WordPress定数の定義など)
スキャンディレクトリ
yaml
parameters:
scanDirectories:
- ../core_src/vendor/twig/twig/src
- ../core_src/vendor/phpoffice/phpspreadsheet/src外部ライブラリの定義を読み込みます(解析対象外、定義のみ)。
除外パターン
yaml
parameters:
excludePaths:
- */vendor/*
- */node_modules/*
- */tests/*
- *Test.php
- */build/*
- */reports/*
- */_old/*以下のパスが解析対象外です:
- ベンダーディレクトリ
- テストファイル
- ビルド出力
- レポート
キャッシュ設定
yaml
parameters:
tmpDir: build/phpstan解析結果のキャッシュは build/phpstan/ に保存されます。
並列処理設定
yaml
parameters:
parallel:
jobSize: 20
maximumNumberOfProcesses: 32
minimumNumberOfJobsPerProcess: 2大規模なプロジェクトでも高速に解析できるよう、並列処理を有効化しています。
結果の見方
成功時の出力
解析が成功し、問題が見つからなかった場合:
[OK] No errorsエラーが見つかった場合の出力
問題が見つかった場合、以下のような出力が表示されます:
------ -------------------------------------------------------------------------
Line core_src/Service/SomeService/SomeService.php
------ -------------------------------------------------------------------------
42 Call to an undefined method App\Model\SomeModel::undefinedMethod().
56 Parameter $id of method App\Service\SomeService::doSomething() has
no type hint.
78 Variable $result might not be defined.
------ -------------------------------------------------------------------------
[ERROR] Found 3 errorsエラーメッセージの読み方
エラーの種類
Call to an undefined method
- 未定義のメソッドを呼び出している
- 例:
$object->undefinedMethod()
Parameter ... has no type hint
- パラメータに型ヒントがない
- 例:
function doSomething($id)→function doSomething(int $id)
Variable ... might not be defined
- 変数が定義される前に使用されている可能性がある
- 例: 条件分岐内でのみ定義される変数を外で使用
Access to an undefined property
- 未定義のプロパティにアクセスしている
- 例:
$object->undefinedProperty
Method ... has no return type
- メソッドの戻り値の型が指定されていない
- 例:
function doSomething()→function doSomething(): void
Null pointer exception
- nullの可能性がある値に対してメソッドを呼び出している
- 例:
$object->method()で$objectが null の可能性がある
エラーレベルの見方
PHPStanは、エラーの重大度を以下のように分類します:
- エラー: 確実に問題があるコード(修正が必要)
- 警告: 潜在的な問題があるコード(修正を推奨)
実例
よくあるエラーと修正方法
例1: 型ヒントの不足
エラー:
Parameter $id of method App\Service\SomeService::doSomething() has no type hint.修正前:
php
public function doSomething($id) {
// ...
}修正後:
php
public function doSomething(int $id): void {
// ...
}例2: null参照の可能性
エラー:
Call to method getValue() on possibly null value.修正前:
php
$result = $this->repository->find($id);
return $result->getValue();修正後:
php
$result = $this->repository->find($id);
if ($result === null) {
throw new NotFoundException();
}
return $result->getValue();例3: 未定義のプロパティ
エラー:
Access to an undefined property App\Model\SomeModel::$undefinedProperty.修正前:
php
class SomeModel {
// $undefinedProperty が定義されていない
}
$model = new SomeModel();
echo $model->undefinedProperty;修正後:
php
class SomeModel {
public string $undefinedProperty;
}
$model = new SomeModel();
$model->undefinedProperty = 'value';
echo $model->undefinedProperty;トラブルシューティング
よくあるエラーと解決方法
1. メモリ不足エラー
症状: Fatal error: Allowed memory size exhausted
解決方法: メモリ制限を増やす:
bash
composer analyse -- --memory-limit=2Gまたは、PHPの設定を変更:
bash
php -d memory_limit=2G vendor/bin/phpstan analyse --configuration=config/phpstan.neon2. "Class not found" エラー
症状: Class 'App\SomeClass' not found というエラーがPHPStanから報告される
原因: オートローダーが正しく読み込まれていない
解決方法:
config/phpstan.neonのbootstrapFilesを確認- Composer オートローダーを再生成(ルートおよび core_src で
composer installを実行):
bash
composer install
cd core_src && composer install3. WordPress関数のエラー
症状: Call to undefined function wp_cache_get() などのエラー
原因: WordPress関数のスタブが正しく読み込まれていない
解決方法: config/phpstan.neon の bootstrapFiles に以下が含まれているか確認:
yaml
- ../vendor/php-stubs/wordpress-stubs/wordpress-stubs.php
- phpstan_bootstrap.php4. 解析が遅い
原因: プロジェクトが大きい、またはキャッシュが無効
解決方法:
- キャッシュをクリアして再解析:
bash
rm -rf build/phpstan
vendor/bin/phpstan analyse --configuration=config/phpstan.neon- 並列処理の設定を調整(
config/phpstan.neonのparallelセクション)
5. 誤検知が多い
原因: 解析レベルが高すぎる、または除外設定が不足
解決方法:
- 一時的に解析レベルを下げる(
level: 3など) - 特定のエラーを無視する設定を追加(
ignoreErrorsセクション)
次のステップ
関連ドキュメント
- 品質管理ツール全体の概要
- PHPUnit実行ガイド - ユニットテスト
- PHPCS実行ガイド - コーディング規約チェック
解析レベルの段階的向上
現在はLevel 4を使用していますが、コードの品質が向上したら、段階的にレベルを上げることを推奨します:
- Level 4 → Level 5: より厳格な型チェック
- Level 5 → Level 6: より詳細なnullチェック
- Level 6 → Level 7: より厳格な型推論
ベストプラクティス
- 定期的な実行: コードを変更したら、必ずPHPStanを実行する
- 段階的な改善: 一度にすべてのエラーを修正しようとせず、段階的に改善する
- 型ヒントの追加: メソッドのパラメータと戻り値に型ヒントを追加する
- nullチェック: nullの可能性がある値は、必ずチェックしてから使用する
最終更新: 2026-01-17