2010年1月21日

類別的繼承

繼承是物件導向程式設計最重要的特性之一,當我們已經創建一些類別後,就會發現在同一個範疇內如果再建立一些新的類別,將會出現大量的重複,新類別和已有類別大部分的屬性和方法都相同,此時有一種方法可以讓我們很方便以現有類別為基礎,快速生成新類別的方法,不需要重複定義相同的屬性和方法,提高程式碼的再使用性,這個方法就是繼承。在物件導向的程式設計中,我們把已有的基礎類別叫做父類別、基本類別,新的類別叫做子類別、衍生類別。子類別預設地從父類別繼承完全相同的屬性和方法,只是簡單地做一些父類別中沒有的擴展就可以了。

在PHP中,一個子類別只能從一個父類別中繼承資料,PHP不支援多重繼承。創建一個子類別時使用extends關鍵字來繼承一個父類別。在類別被定義時,存在三種限定詞(public、private和protected),其中private限定的屬性和方法是不能被繼承的。
private存取權限:如果類別的一個元素被設置成了private存取方式,那麼它將只對類別或者物件本身的內部成員開放。private元素對外部程式來說是被遮罩的,因而是不可見、不能被存取的。當前物件之外的任何類別、物件、程式都不能讀取其私有屬性的值,也不能呼叫私有方法,即使是衍生出的子類別也不能存取到其父類別的私有屬性和方法。
public存取權限:public元素則可以被毫無限制地存取,不管是在類別或者物件的內部還是外部,任何程式碼都可以讀寫public屬性的值,都可以呼叫public方法。在PHP中,如果類別的元素沒有指定存取方式,則預設是public的。
protected存取權限:與private元素相似,protected元素也不能被外部程式存取,但區別在於,protected元素可以被衍生的子類別存取到,而private元素則不行。一個使用protected方法的子類別需要很清楚其父類別的結構才可以。

PHP在同一個頁面和被包含的頁面中不能定義相同名稱的方法,在同一個類別中也不能定義相同名稱的方法。但是在繼承關系的兩個類別中,我們可以在子類別中定義與父類別同名的方法,這樣就把父類別中繼承過來的方法覆蓋掉了。通常父類別同名方法的程式碼內容很多,不可能就幾行,如果我們想保留原有的功能,另外再擴展出一點點的功能,但是又不想把原有的程式碼再重寫一次,這樣就可以使用"parent::"來呼叫父類別中被覆蓋的方法。這裡"::"是範圍解析運算子,用於在沒有宣告任何實體的情況下存取類別中的函式或基本類別中的函式和變數。使用parent存取父類別的成員,仍然受到public、protected、private限定詞的限制。

另外,在PHP的物件導向程式設計中還有抽象類別、介面甚至於是多形的概念,這些就以後有機會再說囉!!!

1 則留言: