Skip to content

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

エラーメッセージの読み方

エラーの種類

  1. Call to an undefined method

    • 未定義のメソッドを呼び出している
    • 例: $object->undefinedMethod()
  2. Parameter ... has no type hint

    • パラメータに型ヒントがない
    • 例: function doSomething($id)function doSomething(int $id)
  3. Variable ... might not be defined

    • 変数が定義される前に使用されている可能性がある
    • 例: 条件分岐内でのみ定義される変数を外で使用
  4. Access to an undefined property

    • 未定義のプロパティにアクセスしている
    • 例: $object->undefinedProperty
  5. Method ... has no return type

    • メソッドの戻り値の型が指定されていない
    • 例: function doSomething()function doSomething(): void
  6. 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.neon

2. "Class not found" エラー

症状: Class 'App\SomeClass' not found というエラーがPHPStanから報告される

原因: オートローダーが正しく読み込まれていない

解決方法:

  1. config/phpstan.neonbootstrapFiles を確認
  2. Composer オートローダーを再生成(ルートおよび core_src で composer install を実行):
bash
composer install
cd core_src && composer install

3. WordPress関数のエラー

症状: Call to undefined function wp_cache_get() などのエラー

原因: WordPress関数のスタブが正しく読み込まれていない

解決方法: config/phpstan.neonbootstrapFiles に以下が含まれているか確認:

yaml
- ../vendor/php-stubs/wordpress-stubs/wordpress-stubs.php
- phpstan_bootstrap.php

4. 解析が遅い

原因: プロジェクトが大きい、またはキャッシュが無効

解決方法:

  1. キャッシュをクリアして再解析:
bash
rm -rf build/phpstan
vendor/bin/phpstan analyse --configuration=config/phpstan.neon
  1. 並列処理の設定を調整(config/phpstan.neonparallel セクション)

5. 誤検知が多い

原因: 解析レベルが高すぎる、または除外設定が不足

解決方法:

  1. 一時的に解析レベルを下げる(level: 3 など)
  2. 特定のエラーを無視する設定を追加(ignoreErrors セクション)

次のステップ

関連ドキュメント

解析レベルの段階的向上

現在はLevel 4を使用していますが、コードの品質が向上したら、段階的にレベルを上げることを推奨します:

  1. Level 4 → Level 5: より厳格な型チェック
  2. Level 5 → Level 6: より詳細なnullチェック
  3. Level 6 → Level 7: より厳格な型推論

ベストプラクティス

  • 定期的な実行: コードを変更したら、必ずPHPStanを実行する
  • 段階的な改善: 一度にすべてのエラーを修正しようとせず、段階的に改善する
  • 型ヒントの追加: メソッドのパラメータと戻り値に型ヒントを追加する
  • nullチェック: nullの可能性がある値は、必ずチェックしてから使用する

最終更新: 2026-01-17