php中的implements 使用詳解

2021-10-05 18:29:05 字數 4520 閱讀 4444

php類中介面的應用關鍵字是inte***ce、implements了,介面是一種成員屬性全部為抽象或常量的特殊抽象類,implements主要是對類名,類所擁有的方法,以及所傳引數起約束和規範做用,有點像 abstract 抽象類。

類中介面的應用

1.關鍵字:inte***ce

2.關鍵字:implements

介面的介紹與規則

介面:一種成員屬性全部為抽象或常量的特殊抽象類。

規則:

1.類中全部為抽象方法。

2.抽象方法前不用加abstract。

3.介面抽象方法屬性為public。

4.成員屬性必須為常量。

格式**如下:

inte***ce

demo

一,介面的定義和呼叫

<?php

inte***ce

cinema

class

order

implements

cinema

}$face

=new

order()

;echo

$face

->

show()

;echo cinema:

:film;

說明:上面的例子要注意一點,介面的方法名是show,繼承介面的類中必須有show這個方法,不然就會報錯。也就是說介面的方法是假的,真正起作用的是在繼承的類中的方法,這裡介面和php的抽象類是不是有點像了?

二,對引數約束比較嚴

<?php

inte***ce

cinema

// 顯示正常

class

order

implements

cinema

}$face

=new

order()

;$face

->

show

(new

order

,$num

='3人');

//輸出 0011排3人

說明:上面的這個例子繼承介面類中,呼叫介面的方法時,所傳引數要和介面中的引數名要一至。不然就會報錯。

三,介面間的繼承和呼叫介面傳遞引數

<?php

inte***ce

cinema

inte***ce

cinema1

extends

cinema

class

order

implements

cinema1

public

function

show1

(order1 $object

,$num

)//注意:show1(order1 $object,$num)中的order1必須根繼承類的名子要一樣class order1。如果不一樣,會報fatal錯誤

}class

order1

}$show

=new

order1

;$show

->

fun();

$test

=new

order()

;$test

->

show()

;$test

->

show1

($show

,$num

='6人');

// 輸出 ***************準備就緒0012排6人

說明:上面的例子可以看到,介面cinemal1繼承了介面cinemal,類order繼承了介面cinemal1。不知道你發現沒有,class類order當中包括有二個方法,乙個是show,乙個show1,並且乙個也不能少,如果少乙個,報fatal錯誤。show1(order1 obj

ect,

object,

object

,

<?php

inte***ce

comparable

class

strings

implements

comparable

function

compare

(self $compare)}

class

integer

implements

comparable

function

compare

(self $compare)}

$first_int

=new

integer

(999);

$second_int

=new

integer

(999);

$first_string

=new

strings

("慕容博");

$second_string

=new

strings

("慕容復");

var_dump

($first_int

->

compare

($second_int))

;// bool(true)

var_dump

($first_string

->

compare

($second_string))

;// bool(false)

按照官網手冊的意思:可以使用「self」強制物件暗示實現類的方法,但是,我們發現無論是php5+那個版本,都報了fatal error:

大致意思是繼承類和介面方法變數相容問題。

正確做法:去掉 self 即可或者把self 替換成 介面的comparable名。如:function compare(comparable $compare)

四,乙個介面多個繼承

<?php

inte***ce

demo

inte***ce

demo2

inte***ce

demo3

class

mydemo

implements

demo

, demo2

function

fun2()

function

fun3()

function

fun4()

}class

yourdemo

extends

mydemo

implements

demo3}$p

=new

yourdemo;$p

->

fun1()

;$p->

fun2()

;$p->

fun3()

;$p->

fun4()

;$p->

fun5()

;

以上輸出

你好--

----

----我也好

大家都好

繼承類後引用介面

上面的例子中我們可以看到介面都使用關鍵字 inte***ce 來定義,並使用關鍵字 implements 來實現介面中的方法,再舉個例子:

<?php

//定義介面

inte***ce

user

class

vipuser

implements

user

function

getusertype()

}class

goods

}$display

=new

goods()

;$display

->

run(

newvipuser);

//vip使用者商品**:70.4

這個例子演示了乙個 php 介面的簡單應用。該例子中,user 介面實現使用者的折扣,而在 vipuser 類裡面實現了具體的折扣係數。最後商品類 goods 根據 user 介面來實現不同的使用者**.

最後總結下:

抽象類和介面的區別

介面是特殊的抽象類,也可以看做是乙個模型的規範。介面與抽象類大致區別如下:

1.乙個子類如果 implements 乙個介面,就必須實現介面中的所有方法(不管是否需要);如果是繼承乙個抽象類,只需要實現需要的方法即可。

2.如果乙個介面中定義的方法名改變了,那麼所有實現此介面的子類需要同步更新方法名;而抽象類中如果方法名改變了,其子類對應的方法名將不受影響,只是變成了乙個新的方法而已(相對老的方法實現)。

3.抽象類只能單繼承,當乙個子類需要實現的功能需要繼承自多個父類時,就必須使用介面。

extends與implements的不區別

extends與implements的不同 1 在類的宣告中,通過關鍵字extends來建立乙個類的子類。乙個類通過關鍵字implements宣告自己使用乙個或者多個介面。extends 是繼承某個類,繼承之後可以使用父類的方法,也可以重寫父類的方法 implements 是實現多個介面,介面的方法...

JAVA 學習之implements的用法

mplements 也是實現父類和子類之間繼承關係的關鍵字,如類 a 繼承 類 b 寫成 class a implements b implements是乙個類實現乙個介面用的 關鍵字 他是用來實現介面中定義的抽象方法。比如 people是乙個介面,他裡面有say這個方法。public inte c...

JAVA 學習之implements的用法

mplements 也是實現父類和子類之間繼承關係的關鍵字,如類 a 繼承 類 b 寫成 class a implements b implements是乙個類實現乙個介面用的 關鍵字,他是用來實現介面中定義的抽象方法。比如 people是乙個介面,他裡面有say這個方法。public inte c...