抽象類別(abstract class)和介面(interface)是物件導向很重要的概念,他們很相似,都是定義要實現的方法,但又有不同的使用情境,PHP的抽象類別和介面有什麼區別,看下面的樣本。
介面(Interface)—— 定義行為
抽象類別(Abstract Class) —— 實現行為
具體類(class)——執行行為
一.介面
介面定義了某種函數的規範,聲明了所需的函數和常量,但是不能指定怎麼實現。介面像是對具體類中方法的規範。
介面定義了發生某一行為需要的方法、方法名。然後允許具體的類來實現這些方法。。
注意:介面類不能定義類成員。定義的方法必須在實現的類中出現。
interface 介面名
{
function 方法1( );
function 方法2( );
}
//實現介面
class 類名 implements 介面名
{
方法1( );
方法2( );
}
二.抽象類別
抽象類別是執行個體化的類,只能作為被其他類基層的基類。例如,可以寫一個關於read的抽象類別,然後電子閱讀,紙質閱讀來繼承read抽象類別。
abstract class 類名
{
各種方法
}
抽象類別可以確保一致性,因為任何衍生類別都必須實現從該抽象類別繼承所有抽象方法,如果沒有實現,那將產生錯誤。
應該用抽象類別?還是 介面?
這是一個問題
** 如果要建一個類模型,這個模型將由一些緊密相關的對象採用,使用抽象類別。如果模型將由不太相關的對象採用,用介面。
** 如果一個具體class將從多個來源繼承行為,用介面。php類可以繼承多個介面,但是不能繼承多個抽象類別。
** 如果所有的類都要共用一個公用的行為實現,用抽象類別,並在其中實現該行為。。先用子類繼承一個抽象類別,繼承後的子類能夠實現原先的行為。。
摘: _______
事物的出現,總是有它出現的理由(需求)!
但是,事物的生存,需要有適應性(靈活)!
比如:長頸鹿,脖子長,這是個抽象的概念;
能吃草(是非肉食性動物的特徵,介面)。
所以,當需要描述長頸鹿的時候,我們就可以用介面(非肉食性動物)和抽象(脖子長)的方法來定義它,
然後,具體是什麼種類/或者顏色的長頸鹿,怎麼個吃草法,這就是具體類了
PHP介面類
首先看介面,定一個介面類,interface class:
<?php
namespace frontend\models;
interface TestInterface
{
public function cloud();
public function sky();
public static function color($color);
}
在PHP中,介面只能定義方法(或靜態方法),但是不能實現具體的方法。在PhpStorm中如果寫具體的方法會提示錯誤。介面比較嚴格的定義需要實現什麼方法,唯寫要實現的方法就行了,不需要具體實現,或定義成員變數。
使用介面:
<?php
namespace frontend\models;
class Test implements TestInterface
{
public function cloud()
{
echo 'Cloud....';
}
public function sky()
{
}
public static function color($color){
}
}
繼承介面類,必須實現介面定義的每個方法,否則也會報錯。這就是PHP的介面,嚴格定義實現哪些方法,並且必須在子類中都實現。
PHP抽象類別
我們定義一個抽象類別:
abstract class Testabstract
{
public $abstract = 'abstract';
abstract function hehe();
public function hehe2()
{
echo 'hehe2';
}
}
這裡有兩個方法,一個是用abstract修飾的,這樣寫表示該方法是子類必須實現的,而抽象類別中只能定義不能具體實現。一個方法是普通的成員方法,而且有具體實現,子類也可以重寫。
class ab extends Testabstract
{
public function hehe()
{
echo 'hehe';
}
}
子類繼承抽象類別,只需實現抽象類別中定義的抽象方法。抽象類別可以定義成員變數,而介面不行。