• PHP中 extends、implements、abstract、interface 的区别


    先说 extends

    1. extends 在类的声明中,通过此“关键字”来继承一个类。

    2. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; 

    3. extends 是继承父类,如果类被声明为final,则不能被继承。PHP中不支持多重继承(Java也不支持,而C++是支持多重继承的),如:class B(子) extends A(父) 

    4. extends 可以实现父类,也可以调用父类初始化 this.parent(),而且会覆盖父类定义的变量或者函数。

    abstract

    用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。

    抽象方法是只有方法声明,而没有方法的实现内容。

    抽象类不能被实例化,通常是将抽象方法做为子类方法重写使用的,且要把继承的抽象类里的方法都实现。

    举例:

    abstract class AbstractClass{
        //定义抽象方法
        abstract protected function getValue();
        //普通方法
        public function printOut(){
            echo $this->getValue();
        }
    }
    
    class CommonClass extends AbstractClass{
        protected function getValue(){
            return "抽象方法的实现";
          }
    }
    
    $class1 = new CommonClass();
    $class1->printOut();

    再说 implements

    1. 一个类通过关键字 implements 声明自己使用一个或者多个接口。

    2. implements 是实现多个接口, 接口的方法一般为空必须重写才能使用。

    3. extends 不支持多重继承,但是可以用接口来实现,这样就要用到 implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开。如:class A implements B,C,D,E (接口)  

    4. implements 实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。

    说到了 implements 就必然要说到 interface,

    interface

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

    interface 即 PHP接口,并用关键字implements来实现接口中方法,且必须完全实现。

    例:

    //定义接口
    interface User{
         function getDiscount();
         function getUserType();
    }
    //VIP用户 接口实现
    class VipUser implements User{
          //VIP用户折扣系数
          private $discount = 0.5;
          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->pirce*$discount;
          }
    }
    $display = new Goods();
    $display->run(new VipUser());

    输出:VIP 商品价格:50

    该例子中,User接口中实现用户的折扣,而在VipUser类里面实现了具体的折扣系数,最后商品类Goods根据user接口来实现不同用户报价

    实现多个接口

    PHP也可以在继承一个类的时候同时实现多个接口

    class 子类 extends 父类 implements 接口1,接口2,...
    {
         ......
    }

    抽象类(abstract)和接口(interface)的区别

    接口(interface)是一个特殊的抽象类(abstract),也可以看作是一个模型的规范,接口与抽象类大致区别如下:

    1,一个子类如果 implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可

    2,如果一个接口中定义的方法名改变了,那么所有继承该接口的子类需要同更新方法名,而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已

    3,抽象类只能单继承,当一个子类需要实现的功能需要集成多个父类,就必须使用接口。

  • 相关阅读:
    【蜕变之路】第20天 UUID和时间戳的生成 (2019年3月10日)
    3.EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
    reactnative资源
    代码
    模板匹配模型、原型模型和区别性特征模型各自如何解释汉字的知觉
    mysqldatadir 转移
    mysql主从设置windows
    心灵鸡汤
    测试的发现遗漏BUG的做法
    汉字模式匹配的过程
  • 原文地址:https://www.cnblogs.com/cutcop/p/13203056.html
Copyright © 2020-2023  润新知