• 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 强调所属关系。

    参看链接

    欢迎留言评论~
  • 相关阅读:
    【uoj3】 NOI2014—魔法森林
    【bzoj2002】 Hnoi2010—Bounce 弹飞绵羊
    【hdu4010】 Query on The Trees
    【uoj129】 NOI2015—寿司晚宴
    【bzoj2877】 Noi2012—魔幻棋盘
    【bzoj2876】 Noi2012—骑行川藏
    【bzoj2875】 Noi2012—随机数生成器
    【codeforces 235E】 Number Challenge
    【bzoj2154】 Crash的数字表格
    【bzoj3529】 Sdoi2014—数表
  • 原文地址:https://www.cnblogs.com/issac-fan/p/12797546.html
Copyright © 2020-2023  润新知