PHP中抽象類和介面的區別以及示例

2021-10-07 02:34:09 字數 1594 閱讀 7991

先看一段**:

<?php

abstract

classa}

abstract

class

bextends

aclass

cextends

bpublic

function

get***()

public

function

getage()

}(newc()

)->

getweight()

;(newc()

)->

getname

('lili'

);

抽象類有以下特點:

任何乙個類,如果它裡面至少有乙個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。定義為抽象的類不能被例項化,被定義為抽象的方法只是宣告了其呼叫方式(引數),不能定義其具體的功能實現。 例如上邊的例子:被abstract關鍵字修飾的類中的abstract方法,沒有{}函式體。

繼承乙個抽象類的時候,非抽象子類必須定義父類中的所有抽象方法;例如上邊的例子, class c 繼承b, 必須實現b和a中所有的抽象方法。

另外,這些方法的訪問控制必須和父類中一樣(或者更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類中實現的方法就應該宣告為受保護的或者公有的,而不能定義為私有的。

方法的呼叫方式必須匹配,即型別和所需引數數量必須一致。例如,子類定義了乙個可選引數(例如,class c中的getname方法中的$age引數),而父類抽象方法的宣告裡沒有,則兩者的宣告並無衝突。

先簡單看乙個介面和其實現的例子:

<?php

inte***ce

study

inte***ce

play

class

aimplements

study

,play

public

function

studyen()

public

function

playball()

public

function

playgame()

public

function

studyja()

}(newa()

)->

playgame()

;

發現了什麼?

發現介面有如下特點:

定義使用的inte***ce關鍵字定義,實現使用implements關鍵字實現

介面中定義的所有方法都必須是公有的,並且是空方法。

介面中也可以定義常量

非抽象類中必須實現介面中定義的所有方法

類可以實現多個介面,用逗號來分隔多個介面的名稱

介面也可以繼承,通過使用 extends 操作符。

可以同時繼承抽象類和實現介面,extends要寫在前面

所有他倆有啥區別呢?

簡單說,就是抽象類定義了乙個類的標準規範,就是繼承這個抽象類的屬於哪個群體。介面定義的是類需要實現的哪些功能。使用過程的區別上邊講的很詳細了。

php抽象類和介面的區別

抽象類和介面的關係 抽象類是一種特殊的類,介面是一種特殊的抽象類 抽象類 什麼是抽象方法 如果乙個類中的方法,沒有方法體的方法就是抽象方法 就是乙個方法沒有使用 而直接使用分號結束 例 abstract function test 抽象方法 如果乙個方法是抽象方法,就必須要用abstract修飾 什...

抽象類和抽象方法以及和介面的區別

abstract 抽象類是不能被例項化的類,可以由其子類來例項化,就像模板一樣 就像貓科,犬科 目的是根據其格式和要求來新建物件。當乙個類被宣告為抽象類時,要在這個類前面加上修飾符abstract。抽象類中的兩種方法 抽象方法和非抽象方法 抽象方法前面由abstract關鍵字,這種方法只宣告返回的資...

php中抽象類與介面的區別

1,抽象類繼承extends 介面的繼承implements 2,介面沒有資料成員,但是抽象類有資料成員,而且可以進行封裝 3,介面沒有建構函式 4,介面中只能使用public修飾符,抽象類可以使用public,protected,private 5,乙個類可以繼承多個介面,但是只能繼承乙個抽象類。...