登入
首頁 所有文章 PHP PHP物件導向觀念—介面(Interface)
長也   2018-05-21 21:16:15(1年前)    1964點閱   0喜歡  0收藏
PHP物件導向觀念—介面(Interface)  

本文討論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出實體。

本文作者:長也

糾結與想不開的資管系學生,之前常碰PHP,現在常碰到的是Python,閒暇之餘就記錄一些筆記。

             

如要發表回覆,請先 登入

  3則回覆
  回覆於2018-05-22 00:11:15
回覆  #1

印象中Design Pattern中強調建議多用介面而非繼承

物件導向真的要應用的好真的蠻難的 尤其專案一大起來就容易亂

軟體工程跟 系統分析似乎真的是有必要的

長也   回覆於2018-05-22 00:32:07

PHP中還有一種寫法叫做"特徵機制",機制可以讓類別直接使用特徵機制當中的所有方法,這樣可以避免使用介面時需要在每個類別中重複篩寫程式碼,也不必建立不好的繼承關係,我覺得蠻方便的,其他語言可能也只能折衷寫成介面了。

長也   回覆於2018-05-22 00:35:41

還有繼承關係感覺很難掌握,而且C++又是可多重繼承,感覺關係很複雜