過載技術概念:
常規大多數面嚮物件語言中的過載概念:
是指,在一個類中,定義多個同名不同參的方法的現象!
類似這樣:
class A{
function f1(){ ... }
function f1($p1) { .... }
function f1($p1, $p2) { .... }
}
//則可以如下去使用:
$a1 = new A();
$a1.f1(); //這裡,“.”就相當於php中的“->”符號。
$a1.f1(11);
$a1.f1(12,34);
PHP語言中的過載概念:
php中,一個類中,不可以定義同名的方法——不管引數如何。
則:
php中的過載概念是:
是指:使用一個物件或類的未定義過的屬性或方法時的內部處理機制。
可見:
php中的過載概念,跟大多數面嚮物件語言中的常規過載概念——完全沒有關係。
比如:
class A{
public $p1 = 1;
}
$a1 = new A();
$a1->p1 = 11; //使用一個定義過的屬性!
$a1->p2 = 22; //使用一個未定義的屬性!
工具/原料
PHP過載overloading技術
屬性過載:
如果使用一個物件的未定義的屬性,就構成屬性過載。
先看本質:
屬性的本質是:變數;
變數有幾種操作:
賦值:
取值:
isset()判斷是否存在:
unset()銷燬變數:
則一個物件的屬性也同樣有該4種操作。
則,屬性過載,就是對一個“未定義”的屬性,進行如上4種操作之一時的應對機制(處理辦法)。
其上,每一個操作,都會自動各自去呼叫一個預先定義好的“魔術方法”:
1:__set($name, $value):
當對一個物件的未定義的屬性,進行“賦值”時,此時會自動呼叫類中預先定義好的魔術方法:__set();
該方法帶2個引數:
$name : 表示該正在賦值的未定義的屬性名;
$value : 表示該正在賦值的值;
實際上,之所以對一個物件的未定義的屬性進行賦值,自然是希望該物件來儲存該資料。
舉例:
2: __get($name)方法
當對一個物件的未定義的屬性,進行“取值”時,此時會自動呼叫類中預先定義好的魔術方法:__get();
該方法帶1個引數:
$name : 表示該正在取值的未定義的屬性名;
程式碼示例:
測試結果:
3:__isset()判斷:
當對一個物件的未定義的屬性,進行“isset()”判斷時,此時會自動呼叫類中預先定義好的魔術方法:__isset();
該方法帶1個引數:
$name : 表示該正在isset()的未定義的屬性名;
測試程式碼結果:
4:__unset()銷燬:
當對一個物件的未定義的屬性,進行“unset()”操作時,此時會自動呼叫類中預先定義好的魔術方法:__unset();
該方法帶1個引數:
$name : 表示該正在unset()的未定義的屬性名;