ReflectionXYZ クラスを使用せずに同じことを達成できます。
call_user_func( array($this->instance, $action) , $args);
$this->instance が何であるかを制御する限り、両方とも同じ方法で保存されます。
$action は、オブジェクト/クラスのメソッド ハッシュ テーブル内のエントリを検索するために使用される文字列であり、オブジェクト コンテキストをエスケープできる (別のオブジェクトに切り替える) 魔法の記号はありません。また、SQL や SQL インジェクションなどのような解析は必要ありません。
ReflectionMethod と call_user_func_array() の両方が、メソッドの保護レベルを尊重します。例えば
class Foo {
public function publicfn() {
echo 'abc';
}
protected function protectedfn() {
echo 'xyz';
}
}
$obj = new Foo;
call_user_func_array(array($obj, 'publicfn'), array());
call_user_func_array(array($obj, 'protectedfn'), array());
$ro = new ReflectionMethod($obj, 'protectedfn');
$ro->invokeArgs($obj, array());
版画
abc
Warning: call_user_func_array() expects parameter 1 to be a valid callback, cannot access protected method Foo::protectedfn() in blabla on line 14
Fatal error: Uncaught exception 'ReflectionException' with message 'Trying to invoke protected method Foo::protectedfn() from scope ReflectionMethod' in blabla:16
Stack trace:
#0 blabla(16): ReflectionMethod->invokeArgs(Object(Foo), Array)
#1 {main}
thrown in blabla on line 16
これが常に当てはまる場合は、検索することをお勧めします。たとえば、エントリがあり- MFH Fixed bug #37816 (ReflectionProperty does not throw exception when accessing protected attribute)
ます。少なくとも php 5.3 ブランチには当てはまります。
$this->instance の基本クラスの public メソッドにはいつでもアクセスできます。
クラス コンテキスト内から保護されたメソッドにアクセスできます。つまり、$this と $this->instance が同じ場合、または $this->instance の派生型の保護されたメソッドにアクセスできます。例えば
class Foo {
protected $instance;
public function __construct(Foo $instance=null) {
$this->instance = $instance;
}
public function publicfn() {
if ( !is_null($this->instance)) {
call_user_func_array( array($this->instance, 'protectedfn'), array());
}
}
protected function protectedfn() {
echo 'Foo::protectedfn() invoked';
}
}
class Bar extends Foo {
protected function protectedfn() {
echo 'Bar::protectedfn() invoked';
}
}
$foo = new Foo(new Bar);
$foo->publicfn();
印刷しBar::protectedfn() invoked
ます。しかし、それを避けるのはそれほど難しいことではありません。