本文討論PHP物件導向當中的介面,應該與其他語言中的物件導向是差不多的。
介面可以做為兩個類別溝通的橋樑,讓一個類別可以知道另外一個類別要做什麼,讓這些類別有了共同的標準;介面中宣告的方法也不會有任何的實作,因為只定義了使用這個介面的類別應該要實作什麼,但不管使用這個介面的類別如何實作。
——這就像是A同學與B同學都要由高雄到台北,但是A同學與B同學可能到台北的方式不同,但是介面只需要確定A與B同學都確實從高雄到了台北。
介面與抽象類別一樣,無法被實體成物件。
我們假設將設計一個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出實體。
關於作者
粉絲專頁
文章分類