Skip to main content

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.phpbuild()メソッドはおよそ次のようなコードです。
Util::getParameterClassName()$parameter->getType() の結果から型名の文字列を取り出すユーティリティです。ReflectionParameter::getType() が返す ReflectionNamedType を扱いやすくラップしています。

PHPアトリビュートの読み取り

PHP 8.0以降、Reflection APIを使ってクラス・メソッド・プロパティに付いたアトリビュートを取得できます。Laravelはこの仕組みを使ってキューアトリビュートやEloquentアトリビュートを処理しています。
PHPアトリビュートとLaravelへの組み込みについては PHPアトリビュート も合わせて参照してください。

アトリビュートを読み取る基本パターン

LaravelがQueue属性を読み取る仕組み(簡略版)

メソッドのアトリビュートを読み取る

パッケージ開発での活用例

クラスの実装インターフェースを検査する

パッケージでクラスが特定のインターフェースを実装しているかを動的に確認できます。

メタデータ取得 — アトリビュートでルートを自動登録する

アトリビュートとReflectionを組み合わせてルートを自動収集するパターンです。

動的なメソッド呼び出し — メソッドインジェクション

Laravelのcall()メソッドはReflectionを使って引数を自動解決します。同じ仕組みをパッケージで実装する例です。

プロパティのデフォルト値を収集する

設定クラスのデフォルト値をReflectionで取得するパターンです。

パフォーマンスへの配慮

Reflection APIはクラス情報を毎回パースするためコストがかかります。プロダクションコードでは結果をキャッシュするのがベストプラクティスです。
PHPのOPcacheはReflectionの結果をキャッシュしません。大量のクラスをループで検査する場合は独自キャッシュを検討してください。ただし、Laravelコンテナ自体も同一リクエスト内ではReflectionClassインスタンスを再利用しています。

次のステップ

PHPアトリビュート

ReflectionClass::getAttributes() を使って読み取るPHPアトリビュートの詳細を学びます。

パッケージ開発

Reflection APIを活用したLaravelパッケージの開発方法を学びます。
最終更新日 2026年5月11日