我有一个API来与我的网络应用程序交互,由一个类定义.每个可公开访问的方法需要在运行之前进行身份验证.而不是在每个方法中反复使用相同的行,我想使用魔术__call函数.但是,它只适用于私有或受保护的方法,我需要公开才能使用Zend_Json_Server.
class MY_Api { public function __call($name,$arguments) { //code here that checks arguments for valid auth token and returns an error if false } public function myFunction($param1,$param2,$param3) { //do stuff when the user calls the myFunction and passes the parameters //this function must remain public so that Zend_Json_Server can parse it //but I want it intercepted by a magic method so that the authentication //can be checked and the system bails before it even gets to this function. } }
__call实际上适用于所有方法,包括public.但是,如果公共方法已经存在,它将不起作用的原因是因为你的类之外的代码已经可以访问公共成员.只有调用代码无法访问的成员才调用__call.
据我所知,除了使用某种装饰图案之外,真正没有任何选择可以做你想要的东西,
class AuthDecorator { private $object; public function __construct($object) { $this->object = $object; } public function __call($method,$params) { //Put code for access checking here if($accessOk) { return call_user_func_array(array($this->object,$method),$params); } } } $api = new MY_Api(); $decoratedApi = new AuthDecorator($api); //any calls to decoratedApi would get an auth check,and if ok,//go to the normal api class' function