また、phpマジックメソッドを利用することもできます。つまり、とと__call()
組み合わせて使用することもできます。call_user_func_array()
method_exists()
class someClass{
public function __call($method, $args) {
$fullMethod = 'someMethod_' . $method;
$callback = array( $this, $fullMethod);
if( method_exists( $this, $fullMethod)){
return call_user_func_array( $callback, $args);
}
throw new Exception('Wrong method');
}
// ...
}
安全上の理由から、次のような他のメソッドの呼び出しを禁止するラッパーを作成することをお勧めします。
class CallWrapper {
protected $_object = null;
public function __construct($object){
$this->_object = $object;
}
public function __call($method, $args) {
$fullMethod = 'someMethod_' . $method;
$callback = array( $this->_object, $fullMethod);
if( method_exists( $this->_object, $fullMethod)){
return call_user_func_array( $callback, $args);
}
throw new Exception('Wrong method');
}
}
そしてそれを次のように使用します:
$call = new CallWrapper( $obj);
$call->{$_GET['method_name']}(...);
または、メソッドを作成してからメソッドexecute
に追加することもできます。someClass
GetCallWrapper()
このようにして、機能をオブジェクト(クラス)に適切にカプセル化し、毎回コピーする必要がなくなります(これは、特権チェックなどの制限を適用する必要がある場合に便利です)。