PHP是单继承语言,因此一个类不能同时继承多个类。当一个类需要多个类的功能时,除了使用trait关键字,还可以使用接口技术。
如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有成员都是public权限的,那么这种特殊的抽象类就是接口。
**应用场景:**
* 保持规范、统一性
* 多个类需要实现同样的方法,只是实现方式不一样
**接口使用规范:**
* 接口不能实例化
* 接口属性必须是常量
* 接口方法必须是public,且不能有函数体
* 类必须实现接口的所有方法
* 一个类可以同时实现多个接口,用逗号隔开
* 接口可以继承接口,使用extends关键字。
* 接口使用关键字interface来定义,使用implements关键字来实现
* 类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误.
* 实现多个接口时,接口中的方法不能有重名。
```
//定义接口
interface User{
function getDiscount();
function getUserType();
}
//VIP用户 接口实现
class VipUser implements User{
// VIP 用户折扣系数
private $discount = 0.8;
function getDiscount() {
return $this->discount;
}
function getUserType() {
return "VIP用户";
}
}
class Goods{
var $price = 100;
var $vc;
//定义 User 接口类型参数,这时并不知道是什么用户
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 元
?>
```
**抽象类和接口的区别:**
* 接口是特殊的抽象类,接口使用关键字implements,抽象类使用extends。
* 接口只能声明常量,抽象类可以声明变量。
* 接口没有构造函数,抽象类可以有。
* 一个类可以继承多个接口,只能继承一个抽象类
* 子类使用implements来实现接口则需要实现接口中所有方法;如果子类继承抽象类,只需要实现需要的方法
* 接口中的方法必须是public,抽象类中的方法可以用public,protected,private