PHP Reflection APIとは
PHP Reflection APIは、クラス・メソッド・プロパティ・関数・パラメーターなどのメタ情報を実行時に取得・検査できるPHPの組み込み機能です。クラスのコンストラクタが何を引数に取るか、メソッドにどんなアトリビュートが付いているかなどを、ソースコードを直接書き換えることなく調べられます。 LaravelはIlluminate/Container/Container.phpの内部でReflection APIを多用しており、DIコンテナの自動解決・PHPアトリビュートの読み取り・メソッドインジェクションなどを実現しています。
主要クラス
ReflectionClass — クラス情報を取得する
ReflectionParameter — コンストラクタ引数を検査する
LaravelコンテナとReflection API
LaravelのIoCコンテナは、Reflection APIを使ってコンストラクタインジェクション(依存性の自動解決)を実現しています。app()->make(SomeClass::class) や依存性注入が動く仕組みを理解しましょう。
コンテナの build() メソッド(簡略版)
実際のContainer.phpのbuild()メソッドはおよそ次のようなコードです。
Util::getParameterClassName() は $parameter->getType() の結果から型名の文字列を取り出すユーティリティです。ReflectionParameter::getType() が返す ReflectionNamedType を扱いやすくラップしています。PHPアトリビュートの読み取り
PHP 8.0以降、Reflection APIを使ってクラス・メソッド・プロパティに付いたアトリビュートを取得できます。Laravelはこの仕組みを使ってキューアトリビュートやEloquentアトリビュートを処理しています。アトリビュートを読み取る基本パターン
LaravelがQueue属性を読み取る仕組み(簡略版)
メソッドのアトリビュートを読み取る
パッケージ開発での活用例
クラスの実装インターフェースを検査する
パッケージでクラスが特定のインターフェースを実装しているかを動的に確認できます。メタデータ取得 — アトリビュートでルートを自動登録する
アトリビュートとReflectionを組み合わせてルートを自動収集するパターンです。動的なメソッド呼び出し — メソッドインジェクション
Laravelのcall()メソッドはReflectionを使って引数を自動解決します。同じ仕組みをパッケージで実装する例です。
プロパティのデフォルト値を収集する
設定クラスのデフォルト値をReflectionで取得するパターンです。パフォーマンスへの配慮
Reflection APIはクラス情報を毎回パースするためコストがかかります。プロダクションコードでは結果をキャッシュするのがベストプラクティスです。次のステップ
PHPアトリビュート
ReflectionClass::getAttributes() を使って読み取るPHPアトリビュートの詳細を学びます。
パッケージ開発
Reflection APIを活用したLaravelパッケージの開発方法を学びます。