Appearance
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の設定で Reflection 拡張機能のスタブが無効になっている」 か、「インデックス(キャッシュ)が壊れている」 可能性が高いです。
対処方法
VS Code (Intelephense 拡張機能) を使用している場合
1. スタブ設定の確認・追加
.vscode/settings.json の intelephense.stubs に reflection が含まれているか確認してください。
json
{
"intelephense.stubs": [
"wordpress",
"Core",
"date",
"pcre",
"spl",
"standard",
"json",
"dom",
"libxml",
"filter",
"reflection" // ← これが含まれているか確認
]
}2. インデックスの再構築
設定を変更した後、以下の手順でインデックスを再構築してください:
- コマンドパレットを開く (
Ctrl + Shift + P/Cmd + Shift + P) Intelephense: Index Workspaceを実行- インデックスの再構築が完了するまで待つ
PhpStorm を使用している場合
- メニューの File > Invalidate Caches... を選択
- Invalidate and Restart をクリック
- 再起動後、インデックスの再構築が完了するのを待つ
また、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を追加 し、インデックスを再構築してください。