您还可以利用 php 魔术方法,即__call()
与call_user_func_array()
and结合使用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()
。
这样您就可以将功能很好地封装到对象(类)中,并且不必每次都复制它(如果您需要应用一些限制,例如权限检查,这可能会派上用场)。