[PHP] Reflection - Class編


Study / PHP    作成日付 : 2020/01/30 03:00:00   修正日付 : 2020/01/30 03:00:00

こんにちは。明月です。


Reflectionは以前JavaとC#でも説明したことがあります。

link - [C#] Reflection(リフレクション)

link - [Java] Reflection - Class編


Reflectionとはプログラム構造を投影して再構築する方法のプログラム技法です。

その意味は我々がクラスを「$obj = new Class()」形で宣言しますが、その宣言するクラスを動的宣言方法で使いたいことです。

つまり、パラメータで「Aタイプのクラスを宣言して」というデータがあればAタイプクラスを、「Bタイプのクラスを宣言して」というとBタイプのクラスを宣言することです。

if($type == "A") {
  $obj = new AClass();
} else if($type == "B") {
  $obj = new BClass();
}

上の例はReflectionではなく、我々がよく知っている形でクラスを宣言した方法です。パラメータでAを受取るとAクラスを宣言するしBを受取るとBクラスを宣言します。

普通だし、問題ないプログラムコーディングですが、もしクラスがAクラス、Bクラスだけではなくたくさんある場合にはどうでしょうか?

後、プロジェクトが大きくなるほど上のパラメータが増えると言えばどうでしょうか?

その時には「$obj = new $type.Class()」の形で作成したらどうかと思う時がありますね。

それがReflectionです。

<?php
  class AClass {
    public function print() {
      return "AClass";
    }
  }
  class BClass {
    public function print() {
      return "BClass";
    }
  }
  //Query StringのTypeのパラメータからデータ取得
  $name = $_GET["type"];
  // ReflectionクラスによってClassを探す。
  // パラメータがAならAClassを、BならBClassを探す。
  $r = new ReflectionClass($name.'Class'); 
  // $obj変数にnewInstance関数を呼出してインスタンスを生成する。
  $obj = $r->newInstance();
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
  <?=$obj->print()?>
</body>
</html>



上の例ではパラメータから「type」を受け取ってReflectionを利用してクラスを宣言しました。

結果はブラウザのアドレスにQuery Stringの「type」に「A」を入れるとAClassのprintを呼出して「AClass」という結果が表示されました。

「type」に「B」を入れるとBClassのprintの関数で「BClass」の結果が表示されました。

<?php
  class EXClass {
    private $data = 10;
    public function print() {
      return "EXClass";
    }
    private function test() {
    
    }
    public function get() {
    
    }
  }
  // Reflectionを利用してEXClassを宣言する。
  $r = new ReflectionClass('EXClass'); 
  // Reflectionの変数「r」のデータ構成を確認する。
  // ReflectionPropertyの設定はアクセス修飾子の関係ずに全てのデータを確認する。
  var_dump($r->getProperties( ReflectionProperty::IS_PUBLIC | 
                              ReflectionProperty::IS_PROTECTED | 
                              ReflectionProperty::IS_PRIVATE));
  // Reflectionの変数「r」の関数構成を確認する。
  var_dump($r->getMethods());
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body></body>
</html>


Reflectionの「getProperties」と「getMethods」の関数でクラス内部のメンバー変数と関数の構成を確認できます。

上の結果を見ると変数には「data」が表示するし、関数には「print」、「test」、「get」がみえます。

アクセス修飾子も関係ずにデータがすべてみえますね。でもアクセス修飾子の情報と関数の場合はパラメータ返却情報がないですね。

実はあるのに、私がまだ知らない状況の可能性もあります。

link - https://www.php.net/manual/en/class.reflectionclass.php


Reflectionに関して続けて調べてみます。

最新投稿