__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"
python 魔術方法
魔術方法 呼叫方式 解釋 new cls instance myclass arg1,arg2 new 在建立例項的時候被呼叫 init self instance myclass arg1,arg2 init 在建立例項的時候被呼叫 cmp self,other self other,self o...
Python魔術方法
參考文章 python 魔術方法指南 魔術方法,顧名思義是一種可以給物件 類 增加魔法的特殊方法,它們的表示方法一般是用雙下劃線包圍 如 init from os.path import join class fileobject 給檔案物件進行包裝從而確認在刪除時檔案流關閉 def init se...
Python 魔術方法
usr bin env python coding utf 8 author ray time 2018 12 6 魔術方法例項 init 建構函式,在生成物件時呼叫,用來初始化值 del 析構函式,釋放物件時使用 比如編輯檔案,把關閉檔案的操作寫在此方法中,程式結束時就會關閉軟體 str 使用pr...