淺談php 抽象類abstract和接口interface
一、抽象類(abstract)
抽象類定義的規範
1、php5支持抽象類和抽象方法
2、定義得抽象類無法被實例化
3、任何一個類裏面聲明了抽象方法,那麽這個類必須聲明為抽象類
4、被定義得抽象方法只能聲明其調用方式(參數),不能定義其具體得功能實現
5、繼續抽象類的子類必須定義父類(抽象類)所有的抽象方法,並且訪問控制(public、protected)必須一致,或者更為寬松 如:父類protected,子類可以protected、public。父類是public,那麽子類就只能是public,不能是protected
6、抽象類訪問控制不能定義private
7、抽象類可以定義非抽象方法
8、抽象類可以定義屬性
代碼示例
<?php abstract class UserAbstract { protected $value1 = 0; private $value2 = 1; public $value3 = 2; //定義一個受保護的抽象方法 abstract protected function register(); //定義一個公有屬性的抽象方法 abstract public function login(); //不能定義一個私有屬性的抽象方法 // abstract private login(); protected function read() { return $this->value2; } } /** * */ class ClassName extends UserAbstract { public function login() { echo ‘這是一個登陸‘; } public function register() { echo ‘這是一個註冊‘; } public function visit() { //訪問抽象類公有的屬性 echo $this->value3; //私有屬性的不能訪問 // echo $this->value2; //訪問抽象類受保護的屬性 echo $this->value1; //訪問抽象受保護的非靜態方法 echo $this->read(); } } $obj = new ClassName(); $obj->login(); $obj->register(); $obj->visit();
二、接口(interface)
接口規範
1、使用接口可以規定某些類實現哪些方法,但接口不需要定義這些方法的具體內容
2、接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。
3、接口中定義的所有方法都必須是公有,這是接口的特性。
4、要實現一個接口,使用 implements 操作符。類可以實現多個接口,用逗號來分隔多個接口的名稱。
5、實現多個接口時,接口中的方法不能有重名。
6、接口也可以繼承,通過使用 extends 操作符。
7、類要實現接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。
8、接口中也可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋。
代碼示例
<?php interface iTemplate { public function login($user,$pwd); public function register($user,$pwd); } interface iTemplateExt extends iTemplate { const READ = ‘read‘; public function read($content); } interface iTemplate2 { public function goods(); } /** * */ class ClassName implements iTemplateExt,iTemplate2 { public function login($user,$pwd) { echo ‘登陸‘; } public function register($user,$pwd) { echo ‘這是一個註冊‘; } public function read($read) { echo ‘閱讀‘; // echo self::READ; } public function goods() { echo ‘商品‘; } } $obj = new ClassName(); $obj->login(‘name‘,‘pwd‘); $obj->register(‘name‘,‘pwd‘); $obj->read(‘pwd‘); $obj->goods(); echo ClassName::READ;
三、接口與抽象的區別以及相同點、應用場景
1、相同點
1、兩者都是抽象類,都不能實例化。
2、interface 實現類及 abstract class 的子類都必須要實現已經聲明的抽象方法。
2、區別
1、 interface 需要實現,要用 implements ,而 abstract class 需要繼承,要用 extends 。
2、一個類可以實現多個 interface ,但一個類只能繼承一個 abstract class 。
3、interface 強調特定功能的實現,而 abstract class 強調所屬關系。(作用的區別)
4、盡管 interface 實現類及 abstract class 的子類都必須要實現相應的抽象方法,但實現的形式不同。 interface 中的每一個方法都是抽象方法,都只是聲明的 (declaration, 沒有方法體 ) ,實現類必須要實現。而 abstract class 的子類可以有選擇地實現。這個選擇有兩點含義: a) abstract class 中並非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子類必須實現。那些沒有 abstract 的方法,在 abstract class 中必須定義方法體; b) abstract class 的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以留給其子類來實現,但此類必須也聲明為抽象類。既是抽象類,當然也不能實例化。
5、 abstract class 是 interface 與 class 的中介。 abstract class 在 interface 及 class 中起到了承上啟下的作用。一方面, abstract class 是抽象的,可以聲明抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實例變量,以供子類通過繼承來使用。
6、接口中的抽象方法前不用也不能加 abstract 關鍵字,默認隱式就是抽象方法,也不能加 final 關鍵字來防止抽象方法的繼承。而抽象類中抽象方法前則必須加上 abstract 表示顯示聲明為抽象方法。
7、接口中的抽象方法默認是 public 的,也只能是 public 的,不能用 private , protected 修飾符修飾。而抽象類中的抽象方法則可以用 public ,protected 來修飾,但不能用 private 。
3、應用場景
interface 的應用場合
1、類與類之間需要特定的接口進行協調,而不在乎其如何實現。
2、作為能夠實現特定功能的標識存在,也可以是什麽接口方法都沒有的純粹標識。
3、 需要將一組類視為單一的類,而調用者只通過接口來與這組類發生聯系。
4、需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯系。
5、規定類的實現規範
6、強迫某個類要實現的方法
abstract class 的應用場合
1、當沒想到完整的類實現,此時可以使用抽象類進行實現
2、定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口
3、某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關系。 abstract 的中介作用可以很好地滿足這一點。
4、規定類的實現規範
2者之間應用場景的淺談
個人使用的方法:當接口能滿足需求的時候使用接口即可,當接口不滿足的時候,就需要使用抽象類。
淺談php 抽象類abstract和接口interface