Skip to content

IDEリンターでのReflectionClass型エラー対処法

問題

PHPStanではエラーが解消されているのに、IDEのリンター(エディタ上の赤線)で「Undefined type 'ReflectionClass'」エラーが表示される場合があります。

原因

IDE(VS CodeのIntelephenseやPhpStormなど)は、実際にPHPを実行してチェックしているのではなく、IDE内部に持っている「辞書(スタブファイル)」と照らし合わせてコード解析を行っています。

  • PHPStan: phpstan_bootstrap.phpvendor/autoload.php を通じて、実際のPHPランタイムやライブラリ構成を理解しています。
  • IDE: PHPの標準関数(strlenなど)やクラス(ReflectionClassなど)が定義された仮想ファイル(スタブ)を参照します。

今回のケースは、「IDEの設定で Reflection 拡張機能のスタブが無効になっている」 か、「インデックス(キャッシュ)が壊れている」 可能性が高いです。

対処方法

VS Code (Intelephense 拡張機能) を使用している場合

1. スタブ設定の確認・追加

.vscode/settings.jsonintelephense.stubsreflection が含まれているか確認してください。

json
{
  "intelephense.stubs": [
    "wordpress",
    "Core",
    "date",
    "pcre",
    "spl",
    "standard",
    "json",
    "dom",
    "libxml",
    "filter",
    "reflection" // ← これが含まれているか確認
  ]
}

2. インデックスの再構築

設定を変更した後、以下の手順でインデックスを再構築してください:

  1. コマンドパレットを開く (Ctrl + Shift + P / Cmd + Shift + P)
  2. Intelephense: Index Workspace を実行
  3. インデックスの再構築が完了するまで待つ

PhpStorm を使用している場合

  1. メニューの File > Invalidate Caches... を選択
  2. Invalidate and Restart をクリック
  3. 再起動後、インデックスの再構築が完了するのを待つ

また、Settings > PHP で設定されている「PHP Language Level」や「CLI Interpreter」が正しく PHP 8.3 を指しているか確認してください。

コードの書き方

ReflectionClassはPHPの標準クラス(グローバル名前空間)ですが、名前空間内で使用する際は、「グローバル空間のクラスであることを明示する」 必要があります。

正しい書き方

PHP 8.0以降では、コンストラクタ引数などからIDEや静的解析ツールが型を推論できるため、@var などのPHPDocコメントは基本的に不要です。古いIDEや一部のリンターとの互換性のために、任意で付与しても構いません。

php
// 方法1: 完全修飾名を使用(PHP 8.0以降の推奨パターン)
$reflection = new \ReflectionClass( $instance );

// 方法2: use文を使用
use ReflectionClass;
// ...
$reflection = new ReflectionClass( $instance );

// (任意)古いIDE向けにPHPDocを追加したい場合
/** @var \ReflectionClass $reflection */
$reflection = new \ReflectionClass( $instance );

現在のコードでは、方法1を使用しており、100% 正解です。PHPStanがパスしていることからも、コードロジックとしての誤りはありません。

まとめ

  • コードの安全性: PHPStanが通っているため、このエラーは「誤検知(False Positive)」です。無視しても動作に影響はありません。
  • 解決策: コードを直すのではなく、IDEの「スタブ設定(intelephense.stubs)」に reflection を追加 し、インデックスを再構築してください。

参考