本篇文章跟大家介紹一下php抽象類別和介面的差別。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
抽象類別
#官方描述請查看文檔,以下是官方描述的梳理版本:
(抽象類別可以沒有抽象方法,但是抽象類別仍然不能被實例化)被定義為抽象的方法只是宣告了其呼叫方式(參數),不能定義其具體的功能實現。
如:
abstract class AbstractClass { // 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{} abstract protected function getValue (); abstract protected function prefixValue ( $prefix ); // 普通方法(非抽象方法) public function printOut () { print $this -> getValue () . "\n" ; } }
此外方法的呼叫方式必須匹配,即類型和所需參數數量必須一致。例如,子類別定義了一個可選參數(類似function eat($a,$b=1)中的$b就是可選參數),而父類別抽象方法的宣告裡沒有,則兩者的聲明並無衝突。這也適用於 PHP 5.4 起的建構子。在 PHP 5.4 之前的建構子宣告可以不一樣的。
補充:
1、抽象類別可以有成員屬性。
2、有人問:抽象方法是否可以定義為私有,答案是不可以,因為抽象介面的目的就是為了抽像出類別模型用來繼承,定義為私有,外部存取不到,偏移了設計目的,會報錯。
3、抽象類別可以實作接口,且可以不實作其中的方法
abstract class Sutdent extends Human { abstract private function study(); } Fatal error: Abstract function Sutdent::study() cannot be declared private in ...
4、抽象類別可以繼承抽象類,且不能重寫抽象父類的抽象方法。這樣的用法,可以理解為對抽象類別的擴展。如
abstract class Human { abstract function eat(); } abstract class Sutdent extends Human { abstract function study(); //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错 Fatal error: Can't inherit abstract function Human::eat() (previously declared abstract in Sutdent) in ... }
介面
#1、介面的定義
interface Play { const LEVEL=10; public function PlayLOL(); public function PlayFootball(); }
2、介面的實作
implements 運算子。非抽象類別中必須實作介面中定義的所有方法,否則會報一個致命錯誤。類別可以實作多個接口,用逗號來分隔多個接口的名稱。
補充:
interface Play { const LEVEL=10; public function PlayLOL(); public function PlayFootball(); } interface Read { public function ReadNovel(); } abstract class Human { abstract function eat(); } //抽象类可以实现接口后不实现其方法,可以继承一个抽象类的同时实现多个接口注意必须要把extends语句写在implements前面,否则会报错 abstract class Sutdent extends Human implements Play,Read { abstract function study(); }
3、介面的繼承
介面可以繼承另一個或多個接口,使用extends關鍵字,多個用',' 隔開,但是不能實作另一個介面,當然更不能繼承抽象類別(繼承抽象類別報錯:Fatal error: PlayGame cannot implement Human - it is not an interface in D:\11 \index.php on line 10)
interface Play { public function PlayFootball(); } interface PlayNew { public function PlayFootballNew(); } interface PlayGame extends play,PlayNew { public function PlayLOL(); }
#區別:
1.對介面的繼承使用implements,抽象類別使用extends. 2.介面中無法宣告變數,但可以宣告類別常數.抽象類別中可以宣告各種變數 3.介面沒有建構子,抽象類別可以有 4.介面中的方法預設為public,抽象類別中的方法可以用public,protected,private修飾 5.一個類別可以繼承多個介面,但只能繼承一個抽象類別相關推薦:PHP教學
以上是php抽象類別和介面之間有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!