通常 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: リフレクション
