接口 interface
PHP 類是單繼承辐董,也就是不支持多繼承甚亭,當(dāng)一個類需要多個類的功能時伐坏,繼承就無能為力了怔匣,為此 PHP 引入了類的接口技術(shù)。
如果一個抽象類里面的所有方法都是抽象方法桦沉,且沒有聲明變量每瞒,而且接口里面所有的成員都是 public 權(quán)限的,那么這種特殊的抽象類就叫 接口 纯露。
接口是特殊的抽象類剿骨,也可以看做是一個模型的規(guī)范。
接口的特點(diǎn)
- 接口的方法必須是公開的埠褪。
- 接口的方法默認(rèn)是抽象的浓利,所以不在方法名前面加abstract。
- 接口可以定義常量钞速,但不能定義成員屬性贷掖,常量的定義和用法和類中常量一樣。
- 類可以實(shí)現(xià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ù)潮改,這時并不知道是什么用戶
function run(User $vc){
$this->vc = $vc;
$discount = $this->vc->getDiscount();
$usertype = $this->vc->getUserType();
echo $usertype."商品價格:".$this->price*$discount;
}
}
$display = new Goods();
$display ->run(new VipUser); //可以是更多其他用戶類型
?>
//輸出:VIP用戶商品價格:80 元
抽象類和接口的區(qū)別
- 一個子類如果 implements 一個接口,就必須實(shí)現(xiàn)接口中的所有方法(不管是否需要)腹暖;如果是繼承一個抽象類,只需要實(shí)現(xiàn)需要的方法即可翰萨。
- 如果一個接口中定義的方法名改變了脏答,那么所有實(shí)現(xiàn)此接口的子類需要同步更新方法名;而抽象類中如果方法名改變了亩鬼,其子類對應(yīng)的方法名將不受影響殖告,只是變成了一個新的方法而已(相對老的方法實(shí)現(xiàn))。
- 抽象類只能單繼承雳锋,當(dāng)一個子類需要實(shí)現(xiàn)的功能需要繼承自多個父類時黄绩,就必須使用接口。