PHP 接口
PHP 類是單繼承曾沈,也就是不支持多繼承忠寻,當(dāng)一個(gè)類需要多個(gè)類的功能時(shí),繼承就無能為力了百揭,為此 PHP 引入了類的接口技術(shù)拘哨。
如果一個(gè)抽象類里面的所有方法都是抽象方法,且沒有聲明變量信峻,而且接口里面所有的成員都是 public 權(quán)限的倦青,那么這種特殊的抽象類就叫 接口 。
接口使用關(guān)鍵字 interface 來定義盹舞,并使用關(guān)鍵字 implements 來實(shí)現(xiàn)接口中的方法产镐,且必須完全實(shí)現(xiàn)。
例子:
<?php
//定義接口
interface User{
function getDiscount();
function getUserType();
}
//VIP用戶 接口實(shí)現(xiàn)
class VipUser implements User{
// VIP 用戶折扣系數(shù)
private $discount = 0.8;
function getDiscount() {
return $this->discount;
}
function getUserType() {
return "VIP用戶";
}
}
class Goods{
var $price = 100;
var $vc;
//定義 User 接口類型參數(shù)踢步,這時(shí)并不知道是什么用戶
function run(User $vc){
$this->vc = $vc;
$discount = $this->vc->getDiscount();
$usertype = $this->vc->getUserType();
echo $usertype."商品價(jià)格:".$this->price*$discount;
}
}
$display = new Goods();
$display ->run(new VipUser); //可以是更多其他用戶類型
?>
運(yùn)行該例子癣亚,輸出:
1 VIP用戶商品價(jià)格:80 元
該例子演示了一個(gè) PHP 接口的簡單應(yīng)用。該例子中获印,User 接口實(shí)現(xiàn)用戶的折扣述雾,而在 VipUser 類里面實(shí)現(xiàn)了具體的折扣系數(shù)。最后商品類 Goods 根據(jù) User 接口來實(shí)現(xiàn)不同的用戶報(bào)價(jià)兼丰。
該例子僅限于演示 PHP 接口的用法玻孟,不涉及其科學(xué)與否。
實(shí)現(xiàn)多個(gè)接口
PHP也可以在繼承一個(gè)類的時(shí)候同時(shí)實(shí)現(xiàn)多個(gè)接口:
class 子類 extends 父類 implemtns 接口1, 接口2, ...
2 {
3 ......
4 }
抽象類和接口的區(qū)別
接口是特殊的抽象類鳍征,也可以看做是一個(gè)模型的規(guī)范黍翎。接口與抽象類大致區(qū)別如下:
- 一個(gè)子類如果 implements 一個(gè)接口,就必須實(shí)現(xiàn)接口中的所有方法(不管是否需要)艳丛;如果是繼承一個(gè)抽象類匣掸,只需要實(shí)現(xiàn)需要的方法即可。
- 如果一個(gè)接口中定義的方法名改變了氮双,那么所有實(shí)現(xiàn)此接口的子類需要同步更新方法名碰酝;而抽象類中如果方法名改變了,其子類對應(yīng)的方法名將不受影響戴差,只是變成了一個(gè)新的方法而已(相對老的方法實(shí)現(xiàn))送爸。
- 抽象類只能單繼承,當(dāng)一個(gè)子類需要實(shí)現(xiàn)的功能需要繼承自多個(gè)父類時(shí)造挽,就必須使用接口碱璃。