Skip to content

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

問題 ​

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

原因 ​

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

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

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

intelephense.stubs は既定一覧を置き換える設定のため、使う拡張は明示列挙が必要です。不足すると例えば次のような誤検知が出ます。

不足スタブ典型エラー例
ReflectionUndefined type ReflectionClass
fileinfoUndefined function finfo_open / Undefined constant FILEINFO_MIME_TYPE
randomUndefined function random_bytes

対処方法 ​

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

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

.vscode/settings.json の intelephense.stubs に、エラーに対応するスタブ(例: Reflection, fileinfo, random)が含まれているか確認してください。

json
{
  "intelephense.stubs": [
    "wordpress",
    "Core",
    "date",
    "pcre",
    "spl",
    "standard",
    "json",
    "dom",
    "libxml",
    "filter",
    "Reflection",
    "fileinfo",
    "random"
  ]
}

対象のスタブ名が含まれているか確認してください。

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 / fileinfo / random など)を追加 し、インデックスを再構築してください。

参考 ​