跟隨我在oracle學習php(46)

設計模式

什麼叫設計模式

所謂設計模式,就是一些解決問題的「常規作法」,是一種認爲較好的經驗總結。面對不一樣的問題,可能會有不一樣的解決辦法,此時就能夠稱爲不一樣的設計模式。php

 

工廠模式

在實際應用中,咱們老是須要去實例化不少不少的類——以獲得對象。sql

則:設計模式

咱們能夠設計出一個「工廠」(其實就是類),該工廠的做用(任務)就是爲人們「生產」各類對象。這種工廠一般只要指定類名,就能夠據此獲取一個該類的對象。spa

 

單例模式

應用中的某種需求:設計

對於某些類,在使用它的時候,從頭至尾(程序運行的開始到結束),都只須要一個對象,就能夠完成全部任務。對象

單例:繼承

某個類,只容許其「建立」出一個對象,即便去進行屢次建立,也只能獲得一個對象。get

$obj1 = new A();string

$obj2 = $obj1; //此時仍是1個對象,$obj2只是最終指向了跟$obj1一樣的對象io

$obj3 = new A(); //這時候纔有了第二個對象。

 

但其實在php語言中,一個對象還可使用clone運算符進行克隆,則就也會「生成」新對象。

所以,還須要在類中使用私有化措施來禁止克隆,最終,單例模式的實現以下:

 

 

實現MysqlDB類的單例模式及完整功能:

 

詳細參看:《MySQLDB.class.php

 

 

抽象類,抽象方法

抽象類

在正常定義類的前面,加上關鍵字:abstract,那就構成抽象類。

abstract  class  類名{.....類的定義.....}

 

可見,抽象類有什麼用?

抽象類能夠用來規範一些類的共同特性,但又不能去對其進行實例化。

怎麼規範:繼承它。

也就是說,抽象類的使命是專門作「父類」:子類就繼承了它的特性,這就是「規範做用」

 

抽象方法:

抽象方法是一個沒有方法體(也不含大括號)的方法定義「頭」而已。

前面須要加上abstract

好比:abstract  function  f1($x1, $y, $m) //注意,後面必定有分號。

抽象方法有什麼用?

其實跟抽象類同樣,配合抽象類,來實現對下級類的「行爲規範」。

即至關於要求下級類去完成該功能(動做),但本身是不作的。

 

抽象類抽象方法細節關係描述

1,若是一個方法定義爲抽象方法,則其所在的類必須定義爲抽象類。

2,但,一個抽象類中,能夠沒有抽象方法——但一般意義不大。

3,子類繼承自一個抽象類,則子類必須實現父類中的全部抽象方法,除非子類也繼續做爲抽象類

4,子類實現抽象父類的方法時,訪問控制修飾符的範圍不能下降,且方法的參數也須一致——其實這就是重寫,因此要知足重寫的要求。

PHP中的重載技術

一般面嚮對象語言的重載技術

其基本語法是這樣的:

在一個類中,有多個同名的方法,每一個方法的參數不一樣而已。這種現象就稱爲「重載」。

參數不一樣能夠是:數量個數不一樣,或類型不一樣,或順序不一樣。

好比:

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();

相關文章
相關標籤/搜索