所謂設計模式,就是一些解決問題的「常規作法」,是一種認爲較好的經驗總結。面對不一樣的問題,可能會有不一樣的解決辦法,此時就能夠稱爲不一樣的設計模式。php
在實際應用中,咱們老是須要去實例化不少不少的類——以獲得對象。sql
則:設計模式
咱們能夠設計出一個「工廠」(其實就是類),該工廠的做用(任務)就是爲人們「生產」各類對象。這種工廠一般只要指定類名,就能夠據此獲取一個該類的對象。spa
應用中的某種需求:設計
對於某些類,在使用它的時候,從頭至尾(程序運行的開始到結束),都只須要一個對象,就能夠完成全部任務。對象
單例:繼承
某個類,只容許其「建立」出一個對象,即便去進行屢次建立,也只能獲得一個對象。get
$obj1 = new A();string
$obj2 = $obj1; //此時仍是1個對象,$obj2只是最終指向了跟$obj1一樣的對象io
$obj3 = new A(); //這時候纔有了第二個對象。
但其實在php語言中,一個對象還可使用clone運算符進行克隆,則就也會「生成」新對象。
所以,還須要在類中使用私有化措施來禁止克隆,最終,單例模式的實現以下:
詳細參看:《MySQLDB.class.php》
在正常定義類的前面,加上關鍵字:abstract,那就構成抽象類。
abstract class 類名{.....類的定義.....}
可見,抽象類有什麼用?
抽象類能夠用來規範一些類的共同特性,但又不能去對其進行實例化。
怎麼規範:繼承它。
也就是說,抽象類的使命是專門作「父類」:子類就繼承了它的特性,這就是「規範做用」
抽象方法是一個沒有方法體(也不含大括號)的方法定義「頭」而已。
前面須要加上abstract。
好比:abstract function f1($x1, $y, $m) ; //注意,後面必定有分號。
抽象方法有什麼用?
其實跟抽象類同樣,配合抽象類,來實現對下級類的「行爲規範」。
即至關於要求下級類去完成該功能(動做),但本身是不作的。
1,若是一個方法定義爲抽象方法,則其所在的類必須定義爲抽象類。
2,但,一個抽象類中,能夠沒有抽象方法——但一般意義不大。
3,子類繼承自一個抽象類,則子類必須實現父類中的全部抽象方法,除非子類也繼續做爲抽象類
4,子類實現抽象父類的方法時,訪問控制修飾符的範圍不能下降,且方法的參數也須一致——其實這就是重寫,因此要知足重寫的要求。
其基本語法是這樣的:
在一個類中,有多個同名的方法,每一個方法的參數不一樣而已。這種現象就稱爲「重載」。
參數不一樣能夠是:數量個數不一樣,或類型不一樣,或順序不一樣。
好比:
class A{
int function f1(int x){......}
int function f1(int x, int y){.....}
int function f1(string s int m){....}
}
但,在php中,一個類中,根本就不能夠定義多個同名方法——這直接是語法錯誤。
實際上,php中的重載,是另外一個「概念」,其指的是:
屬性重載: 若是使用一個不存在的屬性,就會去自動調用類中預先定義好的某個方法以處理數據;
方法重載: 若是使用一個不存在的方法,就會去自動調用類中預先定義好的某個方法以處理該行爲
屬性有哪些使用情形?其實跟變量同樣,只有4種使用情形:
取值:$v1 = 對象->屬性;
賦值:對象->屬性 = XX值;
判斷是否存在:isset(對象->屬性;)
銷燬:unset(對象->屬性;)
所謂屬性重載,就是在面對上述4種情形的屬性使用場景中,該對象若是來「應對」的問題。
若是某屬性不存在,但在語法中使用以下情形,則會發生:
取值:$v1 = 對象->屬性; ===>自動調用類中的__get()方法
賦值:對象->屬性 = XX值; ===>自動調用類中的__set()方法
判斷是否存在:isset(對象->屬性;) ===>自動調用類中的__isset()方法
銷燬:unset(對象->屬性;) ===>自動調用類中的__unset()方法
前提都是:類中要預先定義好這些方法。
一般,沒有的屬性,去使用,顯然是報錯:
先看屬性的取值賦值(最多見情形):
對應,寫出__iset(),和__unset():
當使用一個對象調用一個不存在的普通方法的時候,會自動去調用預先定義好的"__call"方法。
其中,該方法必須帶2個參數,見下圖:
當使用一個對象(類)調用一個不存在的靜態方法的時候,會自動去調用預先定義好的"__callStatic"方法。
其中,該方法必須帶2個參數。其實跟前面同樣!
上面所學的幾個方法都被稱爲「魔術方法」:
__get(), __set(), __isset(), __unset(), __call(), __callstatic();