PHP abstract 与 interface 的区别与用法

结论

  1. 抽象类需要继承,用extends,而接口需要实现,用implements;
  2. 一个类可以实现多个接口,但只能继承一个抽象类
  3. 接口中每个方法都只有声明而没有实现,其中的每个方法实现类必须要实现;而抽象类中只需要实现抽象方法,其它方法可以选择性的实现;
  4. 接口中只能声明public的方法,不能声明private和protected的方法,不能对方法进行实现,也不能声明实例变量;但是抽象类中可以

抽象类

1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类。
2 .抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。
3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。

用法

需要继承,用extends

使用场景

  1. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用 abstractclass 定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
  2. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。 abstract 的中介作用可以很好地满足这一点。
  3. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特 定的功能 。

demo

abstract class BaseShop
{
  public function buy($gid)
  {
      echo('你购买了ID为 :'.$gid.'的商品');
  }
  public function sell($gid)
  {
      echo('你卖了ID为 :'.$gid.'的商品');
  }
  //  abstract 声明之后的方法,继承这个抽象类的子类一定要实现 
  abstract public function view($gid)
  {
      echo('你查看了ID为 :'.$gid.'的商品');
  }
}
class BallShop extends BaseShop
{
     var $itme_id = null;
     public function __construct()
     {
         $this->itme_id = 2314;
     }
     public function open()
     {
         $this->sell($this->itme_id);
     }
}

接口类

interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,不能声明实例变量 ,可以声明常量变量

用法

  1. 接口需要实现,用implements
  2. 一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前。 PHP 只支持继承自一个父类,因此 extends 关键字后只能跟一个类名
  3. 实现多个接口时用逗号隔开 (class D extends B implements iA,iB)
  4. 接口不可以实现另一个接口,但可以继承多个 (interface iC extends iA,iB{})

应用场合

  1. 类与类之间需要特定的接口进行协调,而不在乎其如何实现。
  2. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
  3. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
  4. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

demo

 interface Shop
 {
       public function buy($gid);
       public function sell($gid);
       public function view($gid);
 }
 
 class BaseShop implements Shop
 {
    public function buy($gid)
    {
      echo('你购买了ID为 :'.$gid.'的商品');
    }
    public function sell($gid)
    {
       echo('你卖了ID为 :'.$gid.'的商品');
    }
    public function view($gid)
    {
       echo('你查看了ID为 :'.$gid.'的商品');
    }
 }

差异比较

相同点

  1. 两者都是抽象类,都不能实例化
  2. interface 实现类及 abstractclass 的子类都必须要实现已经声明的抽象方法

不同点

  1. interface 需要实现,要用 implements ,而 abstractclass 需要继承,要用 extends
  2. 一个类可以实现多个 interface ,但一个类只能继承一个 abstractclass
  3. interface 强调特定功能的实现,而 abstractclass 强调所属关系。

参看链接

posted @ 2020-04-28 21:52  五个平均值  阅读(595)  评论(0编辑  收藏  举报