一、前言
特別注意,雖然call()或callStatic()方法就是為實現重載而設計的,但是為了便於理解,先將兩者分開進行理解! ! !
call()方法的特性是它的特性,用其實現重載是實現重載,這是兩碼事~
二、call()方法
# 在PHP5.3.0之後,又增加了一個callStatic()方法。它們都是PHP中的魔術方法,所謂魔術方法,就是系統在特定時刻自動呼叫的方法!除了它們倆,PHP中還有其它一些魔術方法(見手冊)。對於魔術方法,個人理解是,各魔術方法有一個共同點:系統自動調用,有兩個不同點:調用的時間、調用之後產生的作用
# 對於call()和callStatic()的呼叫時間和功能(通俗點就是呼叫之後產生的結果),舉個栗子(程式碼如下)
<?php class A { public function test () { static::who(); A::who(); self::who(); $this->who(); } /** *私有方法 */ private function test2(){ } public static function callStatic($a, $b) { var_dump('A static'); } public function call($a, $b) { var_dump('A call'); } } $a = new A; $a->test(); A::test1(); $a->test2(); ?>
輸出為
#
透過這個栗子,不難看出兩點
·在類別內部呼叫本類別當中的一個無法存取 無法存取 (如果是本類別中,那就只能是不存在才不可訪問,如果是在本類別外不可訪問還可能是沒有訪問權限)的方法時,不管是物件方式,還是
靜態方式,都只能觸發call()方法 ·在類別外部呼叫一個類別中的一個#不可存取
的方法時,物件方式就觸發call()方法,靜態方式就觸發callStatic()方法
ps,不可存取不僅僅代表不存在# 1、再舉個栗子
class MethodTest { public function call($name,$arguments) { // 注意: $name 的值区分大小写 echo "Calling object method '$name'的参数有多个,分别是:".implode ('、',$arguments)."<br/>" ; } /** PHP 5.3.0之后版本 */ public static function callStatic($name,$arguments) { // 注意: $name 的值区分大小写 echo "Calling static method'$name'的参数有多个,分别是:".implode ('、',$arguments)."<br/>" ; } } $obj=new MethodTest ; $obj->runTest ('in object context','另外一个参数'); MethodTest::runTest ('in static context','另外一个参数'); // PHP 5.3.0之后版本
輸出為
透過這個栗子,也不難看出兩點
透過這個栗子,也不難看出兩點
·觸發call()或callStatic()方法時,系統會自動將所呼叫的那個不可訪問的方法的方法名稱作為第一個參數傳入call()或callStatic()方法中,而將所呼叫的不存在的方法傳入的參數,作為第二個參數(而且是封裝成了一個數組,即每一個元素就是調用不可訪問方法時傳入的一個參數)傳入call()或callStatic ()方法中 ·那麼在call或callStatic()方法內部,就可以根據所傳入的兩個參數做一些操作,這就可以與重載掛上勾了!2、額。 。 。最後舉個栗子
class Foo{ public function call($name,$arguments){ print("你是想调用$name"."()方法吗? 额...不好意思呦,该方法不可访问!<br/>"); } } $foo=new Foo; $foo->doStuff(); $foo->doStuff1();
輸出為
二、重載
<?php /** *------------------------------------------------------------- *正是鉴于call()或callStatic()方法的这种特性,即所传入的$name和$arguments,它们就用来实现重载!这点与JS每一个普通方法中都可以获取到一个arguments数组其实异曲同工 *举个例子 */ class Foo1{ public function call($name,$arguments){ if($name=="doStuff"){ /** *实际上,不仅仅可以第一个参数类型,还可以判断参数个数,以及参数顺序,那么就和C++等强数据类型语言的重载效果是一样的了! */ if(is_int($arguments[0])){ $this->doStuffForInt($arguments[0]); }else if(is_string($arguments[0])){ $this->doStuffForString($arguments[0]); } } } private function doStuffForInt($a){ echo "执行的是doStuffForInt()方法"; } private function doStuffForString($a){ echo "执行的是doStuffForString()方法"; } } $foo1=new Foo1; $foo1->doStuff('1');####### ######## #
以上是php中__call()方法如何使用與重載實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!