1. 程式人生 > >對php的接口類與抽象類的理解

對php的接口類與抽象類的理解

代碼復用 bst ID lang 是什麽 提供服務 truct 參數 lock

php 接口類:interface

使用接口(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

接口中定義的所有方法都必須是公有,這是接口的特性。

要實現一個接口,使用 implements 操作符。類中必須實現接口中定義的所有方法,否則會報一個致命錯誤。類可以實現多個接口,用逗號來分隔多個接口的名稱。

Note:

實現多個接口時,接口中的方法不能有重名。

接口也可以繼承,通過使用 extends 操作符。

類要實現接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。

接口中也可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋。

當我們定義了一個接口類時,它裏面的方式是下面的子類必須實現的,比如

interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}

我聲明一個shop接口類,定義了三個方法:買(buy),賣(sell),看(view),那麽繼承此類的所有子類都必須實現這3個方法。

實際上接口類說白了,就是一個類的模板,一個類的規定,如果你屬於這類,你就必須遵循我的規定,少一個 都不行,但是具體你怎麽去做,我不管,如:

class BaseShop implements Shop
{
public function buy($gid)
{
echo ‘你購買了ID為 :‘ . $gid . ‘的商品‘;
}

public function sell($gid)
{
echo ‘你購賣ID為 :‘ . $gid . ‘的商品‘;
}

public function view($gid)
{
echo ‘你瀏覽了ID為 :‘ . $gid . ‘的商品‘;
}
}

你想想,在一個多人合作的大項目裏面,有了接口類是多麽的方便,這樣你就不用去問別人,你的某某功能的方法名是什麽了,當然如果你們喜歡這樣我也沒有辦法。

結論:接口類就是一個類的領導者,指明方向,子類必須完成它指定方法。

php 抽象類 : abstract

PHP 5 支持抽象類和抽象方法。定義為抽象的類不能被實例化。任何一個類,如果它裏面至少有一個方法是被聲明為抽象的,那麽這個類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現。

繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬松)。例如某個抽象方法被聲明為受保護的,那麽子類中實現的方法就應該聲明為受保護的或者公有的,而不能定義為私有的。此外方法的調用方式必須匹配,即類型和所需參數數量必須一致。例如,子類定義了一個可選參數,而父類抽象方法的聲明裏沒有,則兩者的聲明並無沖突。 這也適用於 PHP 5.4 起的構造函數。在 PHP 5.4 之前的構造函數聲明可以不一樣的。

抽象類的作用是,當你發現你的很多類裏面用很多方法你不斷的在重復寫,那你就可以考慮使用抽象類了,你可能會說"我不是可以重寫一個類每個公共類我個實例 化一個這個公共類,調用相同的方法就可以了",這裏是可以,實際上抽象類做的工作也就是這個,不過他省去了你實例化的這個步驟,讓你就像直接調用本類方法 一樣方便,而且你還可以重載這個方法。如:

abstract class BaseShop
{
public function buy($gid)
{
echo ‘你購買了ID為 :‘ . $gid . ‘的商品‘;
}

public function sell($gid)
{
echo ‘你購賣ID為 :‘ . $gid . ‘的商品‘;
}

public function view($gid)
{
echo ‘你瀏覽了ID為 :‘ . $gid . ‘的商品‘;
}
}

class BallShop extends BaseShop
{
var $itme_id = null;
public function __construct()
{
$this->itme_id = 2314;
}

public function open()
{
$this->sell($this->itme_id);
}
}

結論: 抽象類就是一個類的服務提供商,擁有眾多服務,你不用必須用,當需要的時候你來用就可以,如果你覺得不提供服務不滿意,你還可以自己來做。

  • 如果要創建一個模型,這個模型將由一些緊密相關的對象采用,就可以使用抽象類。如果要創建將由一些不相關對象采用的功能,就使用接口。
    • 如果必須從多個來源繼承行為,就使用接口。
    • 如果知道所有類都會共享一個公共的行為實現,就使用抽象類,並在其中實現該行為。
    • 接口實現對特定方法的約束及統一(命名),抽象類則實現代碼復用,兩者結合效果更佳

對php的接口類與抽象類的理解