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...