重載技術overloading
重載的基本概念
重載在“通常面向對象語言”中的含義:
是指,在一個類(對象)中,有多個名字相同但形參不同的方法的現象;
類似這樣:
class C{
function f1(){。。。}
function f1($p1){。。。}
function f1($p1, $p2 ){。。。}
}
$c1 = new C();
$c1->f1();
$c1->f1(2);
$c1->f1(3,4);
重載在“php語言”中的含義:
是指,當對一個對象或類使用其未定義的屬性或方法的時候,其中的一些“處理機制”;
比如:
class A{
public $p1 = 1;
}
$a1 = new A();
echo $a1->p1; //1;
echo $a1->p2; //出錯,未定義的屬性!
則:php中的重載技術,就是來應對上述“出錯”的情況,使代碼不出錯,而且還能“優雅處理”;
舉例:
結果為:
使用php的重載技術,上述代碼修改為:
則結果是:
屬性重載
就是對一個對象的不存在的屬性進行使用的時候,這個類中預先設定好的應對辦法(處理機制);
屬性,本質,就是變量,其只有4個操作:
取值:
當對一個對象的不存在的屬性進行“取值”的時候,就會自動調用內部方法:__GET()
賦值:
當對一個對象的不存在的屬性進行“賦值”的時候,就會自動調用內部方法:__SET()
判斷(isset):
當對一個對象的不存在的屬性進行isset()判斷的時候,就會自動調用內部方法:__isset()
銷毀(unset):
當對一個對象的不存在的屬性進行unset()銷毀的時候,就會自動調用內部方法:__unset()
以上,4個方法,被稱為“魔術方法”;
__GET($屬性名):
在對一個對象的不存在的屬性進行“取值”的時候,會自動調用的方法;
我們其實是可以使用該方法來對這種“意外”情況進行某種特別的處理。
其中,該方法可以帶一個形參,表示這個要對之取值的不存在的屬性名(字符串);
__SET($屬性名,值):
當對一個對象的不存在的屬性進行“賦值”的時候,就會自動調用這個內部的魔術方法;
它有2個形參,分別代表要對不存在的屬性進行賦值的時候的“屬性名”和“屬性值”;
這個方法,結合__GET方法,往往可以使我們定義的類,就有一種“可方便擴展屬性”的特性。
即:類(或對象)的屬性,可以更為方便自由,如下所示:
__ISSET($屬性名):
當對一個對象的不存在的屬性進行isset()判斷的時候,就會自動調用內部方法:__isset();
用法:
$v1 = isset($對象 -> 不存在的屬性); // 此時就會調用這個對象的所屬類中的魔術方法:__isset()
__UNSET($屬性名):
當對一個對象的不存在的屬性進行unset()銷毀操作的時候,就會自動調用內部方法:__unset()
測試代碼:
結果:
方法重載
當對一個對象的不存在的實例方法進行“調用”的時候,會自動調用類中的__call()這個魔術方法;
當對一個類的不存在的靜態方法進行“調用”的時候,會自動調用類中的__callstatic()這個靜態魔術方法;
基本應用實例:
改為:
利用php的重載技術,實現通常的“方法重載”:
以下為測試代碼: