PHP物件導向觀念—介面(Interface) - 筆記長也NotesHazuya

PHP物件導向觀念—介面(Interface)

2018-05-21 21:16:15   PHP

本文討論PHP物件導向當中的介面,應該與其他語言中的物件導向是差不多的。

何謂介面(Interface)?

介面可以做為兩個類別溝通的橋樑,讓一個類別可以知道另外一個類別要做什麼,讓這些類別有了共同的標準;介面中宣告的方法也不會有任何的實作,因為只定義了使用這個介面的類別應該要實作什麼,但不管使用這個介面的類別如何實作

——這就像是A同學與B同學都要由高雄到台北,但是A同學與B同學可能到台北的方式不同,但是介面只需要確定A與B同學都確實從高雄到了台北。

介面的特性

介面無法被實體(NEW)化

介面與抽象類別一樣,無法被實體成物件。

介面不包含欄位,若包含則必為靜態、常數

介面的使用範例

我們假設將設計一個douncment類別來收集資料,然而我希望這個類別可以收集任何的資料型態,當然這個在PHP中是多此一舉,但我的範例也確實的實作了介面,如果你要更好的範例,可以參考現代PHP

class douncment{
    protected $data=[];
    public function adddoc(Douc $doc){
        $key=$doc->getID();
        $con=$doc->getCont();
        $this->data[$key]=$con;
    }
}

宣告介面

interface Douc{
    public function getID();
    public function getCont();
}

宣告介面使用interface關鍵字。我們宣告了Douc介面,當中使用這個介面的類別需要包含公開的getID及getCount方法。

類別使用介面

class STR implements Douc{
    protected $STRI;
    public function __construct($STR)
    {
        $this->STRI=(string)$STR;
    }
    public function getID(){
        return $this->STRI;
    }
    public function getCont(){
        return $this->STRI;
    }
}

class INTT implements Douc{
    protected $INT;
    public function __construct($INT)
    {
        $this->INT=(int)$INT;
    }
    public function getID(){
        return $this->INT;
    }
    public function getCont(){
        return $this->INT;
    }
}

在要使用介面的類別後加入implements關鍵字,並告知類別使用哪個介面。可以看到這兩個類別都各別實作了介面所規範的方法。

$douc=new douncment();
$I=new INTT(500);
$douc->adddoc($I);
$S=new STR("EXCC");
$douc->adddoc($S);
print_r($douc);

這樣我們就可以收集string與int型態的資料,當然還是要強調在PHP中這樣做是比較沒有意義的。

結論

介面不實作任何的內容,只規範要實作哪些內容,並且不在意如何實作內容;而與介面很類似的抽象類別則是會實作部分共同的內容;但是不論是介面或是抽象類別都無法被new出實體。

關於作者


長也

資管菸酒生,嘗試成為網頁全端工程師(laravel / React),技能樹成長中,閒暇之餘就寫一些筆記。 喔對了,也愛追一些劇,例如火神跟遺物整理師,推推。最愛的樂團應該是告五人吧(?)