對於魔術方法 call,

2021-09-28 15:44:18 字數 2854 閱讀 7720

__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...