__call是魔術方法中的一個,當程式調用到當前類中未聲明或沒許可權調用的方法時,就會調用__call方法
class test{ public function emptyFunc(){ $getArgs = func_get_args(); $funcName = $getArgs[0]; //$params = array_slice($getArgs, 1); //var_dump($params); // this is params return $funcName . ' function is not exists'; } public function __call($m, $params) { $arr[] = $m; $arr = array_merge($arr, $params); return call_user_func_array(array($this, 'emptyFunc'), $arr); } protected function nowToTest(){ return 'this is nowToTest'; }}$testObj = new test();var_dump($testObj->nowToTest('params1','params1'));//var_dump result => string(29) "nowToTest function is not exists"
如上test類中,nowToTest方法是存在的,但修飾這方法的是protected(保護),所以執行個體出來的對象沒許可權執行,這時就跑到__call中去了.
_call()有2個參數,第一個$m是當前調用方法的名字,這裡是'nowToTest',第二個$params是調用'nowToTest'方法時傳入的參數。以數組的形式組合在$params中。
call_user_func_array($method, $params)這個php方法的作用是調用 $method方法,參數為$params,如果方法是在類中的話,就用上面那種數組形式調用就可以了,這裡調用的是emptyFunc方法。 func_get_args()的作用是以數組形式擷取傳入的所有參數。而這些參數在__call中傳入的,第一個參數就是方法名。所以最後返回的結果是
"nowToTest function is not exists"