在php中介面抽象類、Final、Static幾個我們用到的相當的簡單特別是大型網站架構時都會有用到了,今天我們來看一篇關於php中抽象類、Final、Static的例子。
1. 介面
(1)對介面的使用是通過關鍵字implements
(2)介面不能定義成員變數(包括類靜態變數),能定義常數
(3)子類必須實現介面定義的所有方法
(4)介面只能定義不能實現該方法
(5)介面沒有建構函式
(6)介面中的方法和實現它的類預設都是public型別的
2. 抽象類
(1)對抽象類的使用是通過關鍵字extends
(2)不能被範例化,可以定義子類必須實現的方法
(3)子類必須定義父類別中的所有抽象方法,這些方法的存取控制必須和父類別中一樣(或者更為寬鬆)
(4)如一個類中有一個抽象方法,則該類必須定義為抽象類
(5)抽象類可以有建構函式
(6)抽象類中的方法可以使用private,protected,public來修飾。
(7)一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類。
3. Final類/方法
(1)final類不能被繼承
(2)final方法不能被重寫
4. Static類/方法
(1)可以不範例化類而直接存取
(2)靜態屬性不可以由物件通過->操作符來存取,用::方式呼叫
<?php # 介面 interface Human{ const TEST_CONST = "test const"; // 定義常數 // public $v; // error,不能定義變數 // static $count; // error,不能定義變數 public function speak(); public function walk(); public function run(); } # 抽象類 abstract class Father implements Human{ public function construct(){ echo "father init n"; } abstract public function walk(); // 抽象方法 public function speak(){ echo "father speak skill n"; } public function run(){ echo "father run skill n"; } } # 非抽象類 class Mother implements Human{ public function construct(){ echo "mother init n"; } # 這裡必須實現walk方法 public function walk(){ echo "mother walk skill n"; } public function speak(){ echo "mother speak skill n"; } public function run(){ echo "mother run skill n"; } } class Son extends Father{ public function walk(){ echo "son walk skill. n"; } public function speak($name = ''){ echo "son: ". $name ." speak skill. n"; } # 存取控制必須和父類別中一樣(或者更為寬鬆) protected function sport(){ echo "son sport skill. n"; } final public function notTeach(){ echo 'son has not to teach skill'; } } class Daughter extends Mother{ public function run($name = ''){ echo "daughter run skill. n"; } } final class GrandChild extends Son{ # 存取控制必須和父類別中一樣(或者更為寬鬆) public function sport(){ echo "GrandChild sport skill. n"; } # Cannot override final method Son::notTeach() // public function notTeach(){} // error } # Class Orphan may not inherit from final class (GrandChild) // class Orphan extends GrandChild{} // error $son = new Son(); $son->speak("Suly"); $daughter = new Daughter(); $daughter->run('Lily'); $grandChild = new GrandChild(); $grandChild->sport();
抽象類和介面的區別
1、對介面的使用是通過關鍵字implements。對抽象類的使用是通過關鍵字extends。當然介面也可以通過關鍵字extends繼承。
2、介面中不可以宣告成員變數(包括類靜態變數),但是可以宣告類常數。抽象類中可以宣告各種型別成員變數,實現資料的封裝。(另JAVA介面中的成員變數都要宣告為public static final型別)
3、介面沒有建構函式,抽象類可以有建構函式。
4、介面中的方法預設都是public型別的,而抽象類中的方法可以使用private,protected,public來修飾。
5、一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類。
抽象類還是介面
如果要建立一個模型,這個模型將由一些緊密相關的物件採用,就可以使用抽象類。如果要建立將由一些不相關物件採用的功能,就使用介面。
如果必須從多個來源繼承行為,就使用介面。
如果知道所有類都會共用一個公共的行為實現,就使用抽象類,並在其中實現該行為。