PHP实战中知识总结 / 面向对象 - 接口(interface)

PHP是单继承语言,因此一个类不能同时继承多个类。当一个类需要多个类的功能时,除了使用trait关键字,还可以使用接口技术。

如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有成员都是public权限的,那么这种特殊的抽象类就是接口。

一、应用场景

(1)保持规范、统一性

(2)多个类需要实现同样的方法,只是实现方式不一样

二、接口使用规范

(1)接口不能实例化

(2)接口属性必须是常量

(3)接口方法必须是public,且不能有函数体

(4)类必须实现接口的所有方法

(5)一个类可以同时实现多个接口,用逗号隔开

(6)接口可以继承接口,使用extends关键字。

(7)接口使用关键字interface来定义,使用implements关键字来实现

(8)类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误.

(9)实现多个接口时,接口中的方法不能有重名。

<?php
//定义接口
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 元
?>

三、抽象类和接口的区别

(1)接口是特殊的抽象类,接口使用关键字implements,抽象类使用extends。

(2)接口只能声明常量,抽象类可以声明变量。

(3)接口没有构造函数,抽象类可以有。

(4)一个类可以继承多个接口,只能继承一个抽象类

(5)子类使用implements来实现接口则需要实现接口中所有方法;如果子类继承抽象类,只需要实现需要的方法

(6)接口中的方法必须是public,抽象类中的方法可以用public,protected,private

PHP实战中知识总结