我們稱以存在的用來派生新類的類為基類,又稱做父類,超類。由已存在的類派生出的新類稱為派生類,又稱為子類。從一個基類派生的繼承稱單繼承,從多個基類派生的繼承稱為多繼承。也就是說:一個類只能直接從一個類中繼承數據。 那麼,怎樣實現繼承呢?很簡單,我們只需要按照創建類的方法後跟一個單詞extends 父類 ...
我們稱以存在的用來派生新類的類為基類,又稱做父類,超類。由已存在的類派生出的新類稱為派生類,又稱為子類。從一個基類派生的繼承稱單繼承,從多個基類派生的繼承稱為多繼承。也就是說:一個類只能直接從一個類中繼承數據。
那麼,怎樣實現繼承呢?很簡單,我們只需要按照創建類的方法後跟一個單詞extends 父類名即可。比如此刻我們已經有了一個父類,代碼如下:
class Preson{ function say() { echo "1"; } }
此時我們想繼承這個類,怎麼辦呢?看下代碼:
class Student extends Preson{ function sing() { $this->say(); } }
可以看到我們並沒有在student這個類中並沒有寫say方法,但在sing方法中去調用了say方法,此刻我們去實例化student這個類後,再去調用sing方法,可以輸出1。證明繼承成功。
$obj = new Student(); $obj->sing();
如果繼承的子類中有和父類相同的方法名會怎麼樣呢?
class Preson{ function say(){ echo "1"; } } class Son extends Preson{ function say(){ echo "2"; } } $obj = new Son(); $obj->say();
輸出結果為2,可見子類的方法覆蓋了父類的方法。如果父類不想被子類覆蓋怎麼辦呢?
class Preson{ function say(){ echo "1"; } } class Son extends Preson{ function say(){ parent::say(); echo "2"; } } $obj = new Son(); $obj->say();
輸出結果為12;我們在子類方法中加入parent::方法就可以讓父類方法不被覆蓋,繼而在子類中延續和完善。
final關鍵字
這個關鍵字只能用來定義類和定義方法, 不能使用final這個關鍵字來定義成員屬性,因為final是常量的意思,我們在PHP里定義常量使用的是define()函數,所以不能使用final來定義成員屬性。
使用final關鍵標記的方法不能被子類覆蓋,是最終版本;
如果還是上面的例子,我們在類前面加一個關鍵字final會怎麼樣呢?
<?php //創建一個父類 final class Preson{ function say() { echo "1"; } } class Student extends Preson{ function sing() { $this->say(); } } $obj = new Student(); $obj->sing(); ?>
顯示結果會報錯:Fatal error: Class Student may not inherit from final class (Preson) 。