LoginSignup
1
0

【PHP】リフレクションを使えばクラスやメソッドの構造を取得することができる

Posted at

初めに

リフレクションという機能をご存じでしょうか?
私は名前は聞いたことあるけどよくわかっていませんでした。
改めて調べてみてすごい便利だなと感じたので、今回はリフレクションについてアウトプットします。

リフレクションとは

リフレクションとは、クラスやメソッドなどの構造をデータとして扱うことができる機能です。
この機能を使うと以下のような情報を取得することができます。

  • クラスの属してる名前空間
  • クラスに定義されているメソッドの一覧
  • クラスが利用しているtraitの一覧
  • クラスの継承元やインターフェース

などなど。

使い方

PHPにはReflectionClassというクラスがあり、以下のようにReflectionClassのインスタンスを作成することでクラスの情報を扱うことができるようになります。

// ReflectionClass型のインスタンスを作成
// 引数にはクラス名を指定
$reflectionClass = new \ReflectionClass('TargetClassName');

ReflectionClassクラスにはクラス構造を取得する様々なメソッドが定義されいます。
以下のようなイメージです。

// TargetClassNameクラスで定義されている定数一覧を取得する
$constants = $reflectionClass->getConstants();

// TargetClassNameクラスで定義されているメソッドの一覧を取得する
$methods = $reflectionClass->getMethods();

様々なリフレクション

リフレクションはクラス情報だけでなくメソッドや定数の情報を取得ためのクラスも用意されています。
定数の情報を扱うReflectionClassConstantクラスやメソッドの情報を扱うReflectionMethodクラスなど、その他にも様々なクラスが定義されています。
詳しくは公式ドキュメントをご覧ください。

// 定数情報を取得
$reflectionConstant = new \ReflectionClassConstant('TargetClassName', 'TARGET_CONST');
$reflectionConstant->isFinal()


// メソッド情報を取得
$reflectionConstant = new \ReflectionMethod('TargetClassName', 'targetMethodName');
$reflectionConstant->isProtected();
$reflectionConstant->isPublic();

リフレクションの使い道

普段書く機会が少ないリフレクションですが、以下のような場面で使われています。
(といっても半分は想像です)

1. フレームワークの内部処理

フレームワークは、そのフレームワークを利用している側が書いたクラスを適切に扱う必要があります。利用者が書いたソースコードはフレームワーク開発者からすると動的なものです。リフレクションを用いれば、そのソース情報をうまく扱うことが可能です。

2. コードの解析

クラスやメソッドの情報を取得すればコードの解析を行うことができます。
アクセス修飾子や親クラスを取得することで、書かれたコードがルールに沿っているかどうかなどを調べることができそうです。

3. ドキュメント自動生成

リフレクションを用いればクラスやメソッドのDocの情報を取得することが可能です。
その情報を元にドキュメント生成が可能になるのかなと思います。

終わりに

今回はリフレクションについて調べてみました。
普通の開発でリフレクションを使う機会は少ないですが、「フレームワークの内側ってどうなってるんだろう」を解消していくのは楽しそうなので、知っておいて損はないですね。
リフレクションを使えば独自の解析ツールなんかも作成できそうで可能性を感じました。

また何か分かったらアウトプットします!
ここまで読んでいただきありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0