2月 092014
 

ReflectionClassについて調べる

ReflectionClassはPHP5から導入されているクラスです。標準APIに搭載されています。
ReflectionClassはクラスについての情報を報告する役割を持っています。

今回は、そのReflectionClassについて、調べてみます。

ReflectionClassを使ってみる

まずは、ReflectionClassのコンストラクタ。

公式によると以下の様に説明が。

public ReflectionClass::__construct ( mixed $argument )

$argumentには、
調べたいクラスのクラス名の文字列か、そのクラスのオブジェクトを指定

ん。。。何かよくわからないので一旦サンプルがあったので書いてみます。

<?php

class A{}

$ref = new ReflectionClass('A');
var_dump($ref);

結果

object(ReflectionClass)#1 (1) {
  ["name"]=>
  string(1) "A"
}

ふむ。とりあえず、newすると、クラスの名前が登録されることは分かった。

公式の例に、以下が載っていたので、これもやってみる

<?php

class A{}

$ref = new ReflectionClass('A');
Reflection::export($ref);

結果

Class [ <user> class A ] {
  @@ /home/k76iKk/prog.php 3-3

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Methods [0] {
  }
}

こんなやつが出てきた。まあ、それっぽいのが入るんだろうなと予測が付いたので、以下を入れてみる。

class A
{
    const CONS = "const.";

    public static $sta_p = "static property";
    public $pub_p        = "public property";
    protected $pro_p     = "protected property";
    private $pri_p       = "private property";

    public static function sta_m()
    {
        return "static method";
    }

    public function pub_m()
    {
        return "public method";
    }

    protected function pro_m()
    {
        return "protected method";
    }

    private function pri_m()
    {
        return "private method";
    }
}

$ref = new ReflectionClass('A');
Reflection::export($ref);

結果は、こんな感じになった

Class [  class A ] {
  @@ /home/kYAJ7V/prog.php 3-31

  - Constants [1] {
    Constant [ string CONS ] { const. }
  }

  - Static properties [1] {
    Property [ public static $sta_p ]
  }

  - Static methods [1] {
    Method [  static public method sta_m ] {
      @@ /home/kYAJ7V/prog.php 12 - 15
    }
  }

  - Properties [3] {
    Property [  public $pub_p ]
    Property [  protected $pro_p ]
    Property [  private $pri_p ]
  }

  - Methods [3] {
    Method [  public method pub_m ] {
      @@ /home/kYAJ7V/prog.php 17 - 20
    }

    Method [  protected method pro_m ] {
      @@ /home/kYAJ7V/prog.php 22 - 25
    }

    Method [  private method pri_m ] {
      @@ /home/kYAJ7V/prog.php 27 - 30
    }
  }
}

まさかメソッドの行数まで出てくるとは・・・。
あ、ちなみに、Methodとかに書いてあるprivate methodとかはreturnで返している値では無いです。
constだけは値がちゃんと入ってました。

メソッド一覧見ててDocCommentが取得できるとか、終了行が取得できるとかなんだこれは・・・って感じになりましたw

メソッド一覧は以下の公式のURLに書いてあります。
http://us1.php.net/manual/ja/class.reflectionclass.php

どうやら、ReflectionClassの目的はクラスのチェックに使うのかな?
と思ったら他にも使い道があるみたい。

インスタンスを作る

どうやらReflectionClassはそのクラスのインスタンスも作れるっぽい。

public object ReflectionClass::newInstance ( mixed $args [, mixed $... ] )
argsは可変長の引数を受け付けて、それをcall_user_funcと同じ方式でクラスのコンストラクタに渡す

または、

public object ReflectionClass::newInstanceArgs ([ array $args ] )
argsは配列で貰い、指定した引数をクラスのコンストラクタに渡す。(PHP5.1.3以上)

class A
{
    function __construct($arg1)
    {
        echo $arg1;
    }
}

$ref = new ReflectionClass('A');
$ref->newInstance('テスト');

結果

テスト

なお、このメソッドの注意点は、コンストラクタ自身を呼び出すという点。コンストラクタがない場合や、publicではない場合はReflectionExceptionが発生する。

よく分からないのが次のnewInstanceWithoutConstructorっていうやつ。これは、PHP5.4からの機能。

public object ReflectionClass::newInstanceWithoutConstructor ( void )

どうやら、クラスの新しいインスタンスをそのクラスのコンストラクタを実行せずに作れるらしい。
しかし、そのクラスが内部クラスであり、コンストラクタを実行せずにインスタンスを作成することが出来なかった場合はReflectionExceptionが発生する

これは・・・どういうことだ?
エラーが出る場合の例が思いつかないのです。

1時間程考えましたが、残念ながらエラーが出る例を思いつくことは出来なかったです。

まあ、調べて何となく役割が分かっただけでもよしとしましょう。
では。

Pocket

 Posted by at 4:45 PM

  One Response to “ReflectionClassについて調べる”

  1. […] 実を言うと、先日書きました、 ReflectionClassについて調べる – 新人Webエンジニアの記録。 が結構参考になりました。 […]

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*