通常 private や protected に指定されているクラスのプロパティやメソッドを読み書きしたり実行したりすることは出来ません。
しかしテストの際などに一時的にその制限を無視してアクセスしたい場合もあります。そういったときは ReflectionClass を使うことで実現できます。
<?php class MyClass { private $foo = ""; private function bar($str){ return $str . "!"; } } $myClass = new MyClass(); $refrection = new ReflectionClass(get_class($myClass)); // プロパティの読み書き $foo = $refrection->getProperty('foo'); $foo->setAccessible(true); $foo->setValue($myClass, "Hello"); // 書き込み echo $foo->getValue($myClass); // 読み取り // メソッドの実行 $bar = $refrection->getMethod('bar'); $bar->setAccessible(true); echo $bar->invoke($myClass, "World");
プロパティに対しては getProperty()、メソッドに対しては getMethod() を使い、setAccessible(true) でアクセスできるようにします。
基本的には private や protected に指定されているということは外部からアクセスされたくない、書き換えられると破損するおそれがあるということですので、このようなリフレクションを使う際は内容を十分に把握し、本当に必要なときだけ利用するようにして下さい。
公式マニュアル:
PHP: リフレクション
Similar Posts:
- [PHP]クラスの基礎 メンバ変数とメンバ関数
- [PHP]マジックメソッドを使ったアクセサ(__get, __set)
- [PHP]ページごとの訪問者数を調べるアクセスカウンター
- [PHP]3次スプライン曲線を使ったスプライン補間
- [PHP]インスタンスが特定クラスのオブジェクトであるか調べる(型演算子)
- [PHP]クラスにメソッドを動的に追加する
- [PHP]クラスとオブジェクト指向の練習(タロットカード占い)
- [PHP]メソッドチェーン