__call
方法在物件方法不存在的時候被呼叫
__callstatic
方法在呼叫物件靜態方法不存在的時候被呼叫
例如
class
car}
(new
car())
->
color()
;class
bus}
bus:
:issale()
;
其實上面的解釋在某些情況下是正確的。但是在一些特殊情形,如果按照這個解釋來理解,就會覺得結果不可思議了。
以下面幾個例子進行說明。
__call的呼叫關注的是方法能不能被訪問
class
carpublic
function
color()
protected
function
isred()
public
function
checkcolor()
}$car
=new
car();
$car
->
color()
;$car
->
isred()
;$car
->
checkcolor()
;
輸出的結果是
color red
car call isred
color red
yes is red
從上面可以看出,其實是否呼叫__call
,依賴的是當前呼叫方能否訪問到要呼叫的函式,如果可以訪問到,則直接呼叫函式,如果不能訪問到,則呼叫魔術方法__call
。所以,呼叫與否關注的是可訪問性。
__callstatic關注的是方法能否被靜態的方式訪問
接下來看另外乙個靜態呼叫的例子
class
carpublic
function
color()
protected
function
isred()
public
function
checkcolor()
}car:
:color()
;car:
:isred()
;(newcar()
)->
checkcolor()
;
輸出內容是
color red
car callstatic isred
color red
yes is red
並且在外部以靜態方式呼叫car::color
伴有notice
級別錯誤提示,但是內部呼叫是沒有的。
所以,__callstatic
關注的是函式在呼叫位置能否被靜態的方式訪問到。如果能訪問到,則直接執行該方法。如果不能則執行__callstatic
方法
__call 與__callstatic同時存在的情況
方法不可訪問的時候,具體呼叫__call,__callstatic方法,依據的並不是呼叫方式是否是靜態呼叫,而是所在的上下文。如果上下文是在可訪問呼叫物件的物件裡,則呼叫__call
,在靜態上下文中呼叫乙個不可訪問方法時,呼叫__callstatic
class
carpublic
function
__call
($method
,$params=[
])public
function
checkcolor()
}$car
=new
car();
car:
:color()
;car:
:isred()
;$car
->
color()
;$car
->
isred()
;(newcar()
)->
checkcolor()
;
輸出內容是
car callstatic color
car callstatic isred
car call color
car call isred
car call color
car call isred
從結果看出,外部靜態呼叫color
,isred
方法,上下文是靜態方式,所以執行的是__callstatic
。
而在checkcolor
方法中,呼叫的上下文處於當前類物件car
當中,即使是以靜態方式呼叫color
,isred
,最終執行的是__call
方法。
1)__call
方法關注方法能否被訪問到,而不僅僅是關注是否存在
2)__callstatic
方法關注的是方法能否被靜態的訪問到,而不是關注方法是否存在,是否是靜態方法。
3)具體執行__call
,__callstatic
,是根據呼叫的上下文。如果處於靜態上下文內,則呼叫__callstatic
。如果處於物件的上線文內,則呼叫__call
魔術方法 call 和
php 5.3 後新增了 call 與 callstatic 魔法方法。call 當要呼叫的方法不存在或許可權不足時,會自動呼叫 call 方法。callstatic 當呼叫的靜態方法不存在或許可權不足時,會自動呼叫 callstatic方法。call funcname,arguments call...
魔術方法之 call
1.call 作用,當呼叫不存在的方法時,會呼叫該方法。實際應用,當程式呼叫不存在的方法時,意外導致程式終止。或者當你呼叫了受保護的或者是私人的方法時,也會自動呼叫 call方法 結果 2.callstatic 形式 callstatic name,arr 應用場景 1 物件呼叫未定義的靜態函式時,...
魔術方法之 call與
class human 魔術方法 call param string method 獲得方法名 param string arg 獲得方法的引數集合 public function call method,params 魔術方法 callstatic public static function c...