[PHP] Reflection - Variable編


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

こんにちは。明月です。


前述でReflectionのClassとMethodを扱う方法に関して説明しました。

link - [PHP] Reflection - Class編

link - [PHP] Reflection - Method編


Reflection機能はプログラムを動的に実装するように使うこともありますが、テストのために使うこともあります。

特にReflectionの変数を扱うことではクラスのメンバー変数に直接に参照と修正ができるのでそれぞれのテストケースを作ってUnitテストが可能です。

その話はコンパイルが可能なJavaとC#の話です。PHPはコンパイルが必要ないスクリプト言語なので、実は私の考えではReflectionのvariable機能はそんなに必要が無いと思います。

クラスのデータの流れを確認するようにはvar_dump関数を利用するとprivateデータまでよくみえるからもっと使うところがないと思いますね。


普通はクラスを作れば変数はprivateに設定するほうが基本コーディング規約です。なので、privateタイプの変数にデータを格納、取得することだけ知れば良いと思います。

<?php
  class EXClass {
    // メンバー変数dataに「init」を格納する。
    private $data = "init";
    // 外部でメンバー変数dataを取得するようなgetter関数
    public function getData() {
      return $this->data;
    }
  }
  // ReflectionでEXClassを探す。
  $r = new ReflectionClass('EXClass'); 
  // インスタンスを生成する。(new EXClass()と同じ意味)
  $obj = $r->newInstance();
  // メンバー変数名dataを探す。
  $v = $r->getProperty("data");
  // private, protectedの場合、外部で取得ができないのでアクセスできるように設定。
  $v->setAccessible(true);
?>
<!DOCTYPE html>
<html>
  <head><title>title</title></head>
  <!-- Reflection variable取得関数を利用して生成したインスタンスの変数を取得 -->
  <body><?=$v->getValue($obj)?></body>
</html>

上の例をみれば、EXClassの中で「data」のメンバー変数はprivateに設定されています。まず、そのデータを取得するようにEXClassのインスタンスを生成します。

getProperty関数で変数のオブジェクトを取得してsetAccessible関数で「private」のアクセス修飾子を無効化します。

bodyタグの中でgetValueを利用してobjのインスタンスのdata変数を取得して出力します。


取得しましたから今回は格納してみましょう。

<?php
  class EXClass {
    private $data = "init";
    public function getData() {
      return $this->data;
    }	
  }
  // インスタンス生成は普通はnewキーワードで生成する。
  $obj = new EXClass();

  // ReflectionでEXClassを探す。
  $r = new ReflectionClass('EXClass'); 
  // メンバー変数dataを探す。
  $v = $r->getProperty("data");
  // private, protectedのアクセス修飾子を外部で呼出すことができるように設定
  $v->setAccessible(true);
  // dataのメンバー変数にデータ(change)を格納する。
  $v->setValue ($obj,"change");
?>
<!DOCTYPE html>
<html>
  <head><title>title</title></head>
  <!-- data変数の値をgetDataのgetterで取得して出力する。 -->
  <body><?=$obj->getDate();?></body>
</html>

上の例はインスタンスをReflectionで生成したことじゃなく、newキーワードで生成しました。普通の文法ならインスタンスを「new」で生成します。

getValueでメンバー変数を取得できたら、setValueではデータが格納できます。


結果はEXClassのdata変数は「change」という値に変更されたことを確認できます。

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


Reflectionまで纏めて説明しました。次の投稿からは.htaccessと上のReflectionを利用してapache+php環境でMVCパターンを構成しようと思います。

PHPでMVCモデルに作成が出来たら、JavaやC#みたいにプロジェクト管理がしやすくなると思います。

最新投稿