はじめに
この記事で紹介する機能は、PHP4からPHP5にまだアップグレードしていない人にとっては、大いに心引かれる機能だと思います。それは、PHP5で新たにサポートされたリフレクションAPIです。リフレクションAPIを使用することで、変数、インターフェイス、関数、メソッド、パラメータ、クラスなどの詳細情報を入手できます。リフレクションAPIは機能が豊富で、多数のクラスやメソッドを利用してリフレクションを実現できます。
この記事ではまず、リフレクションAPIの概念について理解していただくために、リフレクションAPIのクラスとメソッドについて、短い例を交えて簡単に説明します。その後で、PHPで作成した実際的なサンプルアプリケーションを2つ紹介します。1つは、呼び出すメソッドを実行時に判別するアプリケーションで、もう1つは、PHPクラスの情報を示す整形されたHTMLドキュメントを自動生成するアプリケーションです。
リフレクションAPIのクラスとメソッド
リフレクションAPIの機能の概略を示すために、リフレクションAPIのクラスとメソッド、およびそれらの関係を表す図を紹介します(図1)。これを見るとわかるように、リフレクションAPIのほとんどのクラスは、Reflectorインターフェイスを実装しています(Reflection、ReflectionException、およびReflectionFunctionAbstractは除く)。エクスポート可能なすべてのリフレクションクラスがReflectorインターフェイスを実装しています。
ReflectionClass
ReflectionClassクラスは、リフレクションAPIの主役となるクラスです。このクラスを使用することで、他のクラス群へのリフレクションを適用し、その時点での全クラスコンポーネントについての情報を抽出します。ReflectionClassのメソッドにはよく似たものが多いので、ここでは、いくつかのメソッドについてのみ使用例を紹介し、残りはメソッド名と説明を示すにとどめます。
public void construct(string name)
― ReflectionClassのコンストラクタです。public string getName()
― 調査したクラス名を返します。public ReflectionMethod getConstructor()
― 解析されたクラスコンストラクタを表すReflectionMethodオブジェクトを返します。public ReflectionMethod getMethod(string name)
― nameパラメータで指定したメソッドを表すReflectionMethodオブジェクトを返します。public ReflectionMethod[] getMethods()
― 解析されたすべてのクラスメソッドを表すRelectionMethodオブジェクトの配列を返します。
// EXAMPLE $class = new ReflectionClass('TestClass'); echo "The class name: ".$class->getName();
// EXAMPLE $class = new ReflectionClass('TestClass'); $constructor = $class->getConstructor(); echo $constructor;
// EXAMPLE $class = new ReflectionClass('TestClass'); $method = $class->getMethod('testMethod_1'); echo $method;
// EXAMPLE $class = new ReflectionClass('TestClass'); $methods = $class->getMethods(); foreach($methods as $in) { echo $in; }
このクラスには、上記の挙げたメソッドの他にも、以下のような同様のメソッドがあります。使い方も同様です。つまり、調査するクラスの名前をパラメータで渡してReflectionClassのインスタンスを作成し、そのインスタンスを使用して以下のメソッドを呼び出します。
- public ReflectionProperty getProperty(string name)
- public ReflectionProperty[] getProperties()
- public mixed getConstant(string name)
- public array getConstants()
- public ReflectionClass[] getInterfaces()
以上のメソッドで取得したオブジェクトを使用すると、クラスの内部をさらに掘り下げた情報にアクセスできます。これについて、次のセクションで説明します。