深入PHP物件導向 模式與實踐 高階特性(4)

2021-07-29 00:17:43 字數 2646 閱讀 5691

final關鍵字可以終止類的繼承。final類不能有子類,final方法不能被覆寫。

下面定義乙個final類:

<?php

final

class

checkout

class

illegalcheckout

extends

checkout

//將產生致命錯誤

如果只在checkout中宣告某個類方法為final,而不是將整個類宣告為final,那麼繼承checkout就不會出現致命錯誤。final關鍵字應該放在其他修飾詞(例如protected或static)之前,如下所示:

<?php

class

checkout

}class

illegalcheckout

extends

checkout

}//將產生致命錯誤

php提供了內建的***(interceptor)方法,他可以「攔截」傳送到未定義方法和屬性的訊息。它也被稱為過載(overloading),但是自從這個術語在其他語言中被賦予了其他含義,我認為還是叫它***好。php5支援3個內建的***方法,當遇到合適的條件時就會被呼叫。

__get()和__set()方法用於處理類(或其父類)中未宣告的屬性。當客戶端**試圖訪問未宣告的屬性時,__get()方法會被呼叫,並帶乙個包含要訪問的屬性名稱的字串引數。無論從__get()返回了什麼,都會發給客戶端**,就好像帶有該值的目標屬性存在一樣。下面是乙個簡單的例子:

class

person

"; if (method_exists($this, $method))

}public

function

getname

()

public

function

getage

()

}

如果方法存在,就呼叫它並把它的返回值傳遞給客戶。如果不存在,則什麼也不做。使用者試圖訪問的屬性被解析為null。

__isset()方法和__get()類似。當客戶在乙個未定義的屬性上呼叫isset()時,__isset()被呼叫。

class

person

"; if (method_exists($this, $method))

}public

function

setname

($name)

}public

function

setage

($name)

}

__unset()和__set()相對應。當unset()在乙個未定義的屬性上被呼叫時,__unset()會被呼叫,並以該屬性的名稱作為引數,然後你可以根據屬性名進行必要的處理。

public

function

__unset

($property)

";if (method_exists($this, $method))

}

__call()方法可能是最有用的***方法。當客戶端**要呼叫類中未定義的方法時,__call()會被呼叫。__call()接受兩個引數,乙個是方法的名稱,乙個是傳遞給要呼叫方法的所有引數(陣列)。__call()方法返回的任何值都會返回給客戶,就好像呼叫乙個真實存在的方法一樣。__call()方法對於實現委託也很有用。委託是指乙個物件**或者委託乙個請求給另乙個物件,被委託的一方替原先物件處理請求。下面建立乙個類將person類的資訊格式化並輸出:

class

personwriter

public

function

writeage

(person $p)

}

我們可以通過繼承personwriter類以不同的方式輸出person類的資訊。下面結合__call()和personwriter物件來實現person類。

class

person

public

function

__call

($methodname, $args)

}public

function

functionname

()

public

function

getage

()

}

**person類接受乙個personwriter物件作為構造方法的引數,並將它儲存在屬性變數$writer中。在__call()方法中,我們使用引數methodname,檢查personwriter物件中是否存在同名的方法。如果相應的方法存在,我們就委託personwriter物件來處理對方法的呼叫,把當前類(person)的例項作為引數傳遞給personwriter物件(使用偽變數)。這樣我們就可以不用手動在person類中呼叫如下委託方法:

function

writename

()

***方法是非常有用的,但在使用時要慎重考慮,而且最好附上文件,清楚的說明**的細節。

深入PHP物件導向 模式與實踐 設計模式

設計模式便是分析過的問題和問題解決方案所闡釋的優秀實踐。如何處理乙個請求?如何將請求資料轉換成系統對應的指令?如何獲得資料?如何顯示結果?等等。隨著時間流逝和經驗積累,我們會或優雅或困難地回答問題,並總結出一些非正式的 可在專案中重複使用的解決方案,而這些解決方案便是設計模式。設計模式記錄並規範了這...

深入PHP物件導向 模式與實踐 模式原則(1)

通過以靈活的方式來組合物件,元件能在執行時被定義。設計模式 將此提煉出乙個原則 組合優於繼承。繼承是應對變化的環境及上下文設計的有效方式,然而它會限制靈活性,尤其是當類承擔了過多的責任的時候。利用這種繼承模式,我們可以在課程的實現之間切換。可是如果引入一組新的特殊性,又會怎麼樣?比如我們需要處理演講...

深入PHP物件導向 模式與實踐 模式原則(2)

如果類之間有非常強的依賴性,那麼這樣的系統就很難維護,因為系統裡的乙個改動會引起一連串的相關改動。重用性是物件導向設計的主要目的,而緊耦合便是它的敵人。當我們看到系統中乙個元件的改變迫使系統其他許多地方也發生改變的時候,就可以診斷為緊耦合了。在你自己的專案中,你會看到很多這種需要分離元件的情況。例如...