先看一段**:
<?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,乙個類可以繼承多個介面,但是只能繼承乙個抽象類。...