tags:抽象類別介面抽象類別和介面php
#引言:這是一個面試常被問到的問題,也是經典問題。我們盡量引用官方權威的說明或經過實驗來證明本文所說的內容準確性。
抽象類別
定義為抽象的類別不能被實例化。任何一個類,如果它裡面至少有一個方法是被聲明為抽象的,那麼這個類別就必須被宣告為抽象的。 (抽象類別可以沒有抽象方法,但是抽象類別仍然不能被實例化)被定義為抽象的方法只是聲明了其呼叫方式(參數),
不能abstract class AbstractClass { // 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{} abstract protected function getValue (); abstract protected function prefixValue ( $prefix ); // 普通方法(非抽象方法) public function printOut () { print $this -> getValue () . "\n" ; } }
類似function eat(
b=1)中的$b就是可選參數
),而父類別抽象方法的宣告裡沒有,則兩者的宣告並無衝突。這也適用於 PHP 5.4 起的建構子。在 PHP 5.4 之前的建構子宣告可以不一樣的。Fatal error: Abstract function Sutdent::study() cannot be declared private in D:\11\index.php on line 10abstract class Sutdent extends Human{ abstract private function study();}
抽象類別可以繼承抽象類,
且不能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 D:\11\index.php on line 11
介面中定義的所有方法都必須是公有,這是介面的特性,protected和private會報錯誤(
Fatal error: Access type for interface methodinterface Play { const LEVEL=10; public function PlayLOL(); public function PlayFootball(); }
# 介面的實作
要實作一個接口,使用implements 運算子。非抽象類別中必須實作介面中定義的所有方法,否則會報一個致命錯誤。類別可以實作多個接口,用逗號來分隔多個接口的名稱。 補充:
抽象類別實作接口,不需要重新其中的方法。類別要實作接口,必須使用和介面中所定義的方法完全一致的方式。否則會導致致命錯誤。
- 實作多個介面時,介面中的方法不能有重名。
- 介面也可以繼承,透過使用 extends 運算子。
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();}介面的繼承介面可以繼承另一個或多個接口,使用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 Play1 { public function PlayFootball(); }interface PlayGame extends play,Play1{ public function PlayLOL(); }總結######一般都在這裡寫相同點和不同點,我偏不寫,嘿嘿,因為我覺得上面寫的夠詳細了。 ###
我們簡單總結一句:抽象類別一般用來定義一類實體是什麼,他包含了屬性,抽象方法和非抽象方法。介面用來定義一類實體能做什麼,一般認為他只有抽象方法,常數極少用到。
相關推薦:
#以上是php的抽象類別和介面的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!