php中抽象類和接口的區(qū)別

  1. 概念

面向?qū)ο?/a>的三大概念:封裝,繼承,多態(tài) ;
把屬性和方法封裝起來(lái)就是類。 一個(gè)類的屬性和方法被另外的類復(fù)制就是繼承,PHP里面的任何類都可以被繼承,被繼承的屬性和方法都可以被子類重新定義,這就是多態(tài)性。 抽象類和抽象方法: 所謂抽象方法就是只有名字的空“函數(shù)”,而且抽象方法必須是空方法。 所謂抽象類就是包含抽象方法的類,同時(shí)抽象類也可以包含普通方法。 因?yàn)槌橄蠓椒ū仨毷强辗椒?,所以任何子類在繼承抽象類的時(shí)候,都必須重新定義抽象方法的具體內(nèi)涵,才能實(shí)現(xiàn)實(shí)例化。 接口: 只包含抽象方法的特殊抽象類。 換句話說(shuō),接口類中不允許存在普通方法和屬性。

  1. 案例分析

    1.php 接口類:interface

    其實(shí)他們的作用很簡(jiǎn)單,當(dāng)有很多人一起開發(fā)一個(gè)項(xiàng)目時(shí),可能都會(huì)去調(diào)用別人寫的一些類,那你就會(huì)問(wèn),我怎么知道他的某個(gè)功能的實(shí)現(xiàn)方法是怎么命名的呢,這個(gè)時(shí) 候php接口類就起到作用了,當(dāng)我們定義了一個(gè)接口類時(shí),它里面的方式是下面的子類必須實(shí)現(xiàn)的,比如 :

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

我聲明一個(gè)shop接口類,定義了三個(gè)方法:買(buy),賣(sell),看(view),那么繼承此類的所有子類都必須實(shí)現(xiàn)這3個(gè)方法少一個(gè)都不行,如果子類沒有實(shí)現(xiàn)這些話,就無(wú)法運(yùn)行。 實(shí)際上接口類說(shuō)白了,就是一個(gè)類的模板,一個(gè)類的規(guī)定,如果你屬于這類,你就必須遵循我的規(guī)定,少一個(gè)都不行,但是具體你怎么去做,我不管,那是你的事,如:

class BaseShop implements Shop 
  { 
    public function buy($gid) 
  { 
    echo('你購(gòu)買了ID為 :'.$gid.'的商品'); 
  } 
    public function sell($gid) 
  { 
    echo('你賣了ID為 :'.$gid.'的商品'); 
  } 
    public function view($gid) 
  { 
    echo('你查看了ID為 :'.$gid.'的商品'); 
  } 
} 

你想想,在一個(gè)多人合作的大項(xiàng)目里面,有了接口類是多么的方便,這樣你就不用去問(wèn)別人,你的某某功能的方法名是什么了,當(dāng)然如果你們喜歡這樣我也沒有辦法。 結(jié)論 : 接口類就是一個(gè)類的領(lǐng)導(dǎo)者,指明方向,子類必須完成它指定方法。 2.php 抽象類 : abstract 其實(shí)抽象類和接口類有一部分很像,記得在哪里看見這樣一句話,抽象類就把類像的部分抽出來(lái),這句看上去很搞笑,其實(shí)它說(shuō)出了抽象類的真理,抽象類的作用是,當(dāng)你發(fā)現(xiàn)你的很多類里面用很多方法你不斷的在重復(fù)寫,那你就可以考慮使用抽象類了,你可能會(huì)說(shuō)“我不是可以重寫一個(gè)類每個(gè)公共類我個(gè)實(shí)例化一個(gè)這個(gè)公共類,調(diào)用相同的方法就可以了”,這里是可以,實(shí)際上抽象類做的工作也就是這個(gè),不過(guò)他省去了你實(shí)例化的這個(gè)步驟,讓你就像直接調(diào)用本類方法一樣方便,而且你還可以重載這個(gè)方法。如:

abstract class BaseShop 
{ 
public function buy($gid) 
{ 
echo('你購(gòu)買了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); 
} 
} 

這里是一個(gè)例子,想上面一樣我定義了一個(gè)商店類,抽出了它所有像的部分,買(buy),賣(sell),看(view),并且抽象類里都實(shí)現(xiàn)了這些方法,那么繼承它的子類就自動(dòng)獲得了這些方法,子類就做它自己獨(dú)特的東西,介紹代碼的重復(fù),提高復(fù)用性。 結(jié)論: 抽象類就是一個(gè)類的服務(wù)提供商,擁有眾多服務(wù),你不用必須用,當(dāng)需要的時(shí)候你來(lái)用就可以,如果你覺得不提供服務(wù)不滿意,你還可以自己來(lái)做。

3) 他們的不同點(diǎn): 1。抽象類中可以有非抽象的方法而接口中只能夠有抽象的方法! 2。一個(gè)類可以繼承多個(gè)接口,而一個(gè)類只能繼承一個(gè)抽象類! 3。接口的使用方式通過(guò)implements關(guān)鍵字進(jìn)行,抽象類則是通過(guò)繼承extends關(guān)鍵字進(jìn)行!

4.接口中不可以聲明成員變量(包括類靜態(tài)變量),但是可以聲明類常量。抽象類中可以聲明各種類型成員變量,實(shí)現(xiàn)數(shù)據(jù)的封裝。(另JAVA接口中的成員變量都要聲明為public static final類型)

5、接口沒有構(gòu)造函數(shù),抽象類可以有構(gòu)造函數(shù)。

6、接口中的方法默認(rèn)都是public類型的,而抽象類中的方法可以使用private,protected,public來(lái)修飾。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容