PHP抽象类与接口的区别

抽象类是什么

  • 抽象类是一种特殊的类,使用abstract修饰
  • 抽象类不能被实例化,只能被继承
  • 抽象方法不能设置使用private 修饰,由于抽象类不能被实例化,私有成员没有意义。
  • abstract 还能够修饰方法,称之为抽象方法:抽象方法所在的类必须是抽象类,抽象方法不能有方法体
  • 若是子类继承了抽象类,要么子类自身是抽象类,要么实现全部抽象方法
  • 抽象类的目的是规范子类,一般会在比较大型或者规范的项目中才会使用
  • 抽象类中不容许有成员属性
<?php
// 抽象类 abstract

abstract class Human{

    // 普通方法
    public function show(){}

    // 抽象方法,抽象方法存在的类必须是抽象类
    // 抽象方法不能有方法体
    public abstract function eat();
};

// 抽象类不能被实例化
// new Human();

// 继承抽象类的要么为抽象类,要么实现抽象类的全部抽象方法。
class Man extends Human{
    // 实现抽象方法 eat
    public function eat(){}
};
// 能够正常实例化
new Man();

// 抽象子类继承抽象类
abstract class Woman extends Human{
    public abstract function makeup();
}

abstract class Wo extends demo{
    // 实现抽象方法 eat
    public function eat(){}

    // 实现抽象方法 makeup
    public function makeup(){}
}
 // 只有实现了抽象类和继承的抽象类的全部全部抽象方法,才能够实例化
new Wo();
复制代码

接口是什么

PHP是单继承的,为了解决这个问题,PHP引入了接口。接口是一种特殊的抽象类,而抽象类又是一种特殊的类。php

  • 接口不是类,但与类有相似的结构,目的是为了约束类。
  • 接口不能实例化,但类能够实现接口(注意是实现不是继承)
<?php
interface 接口名{}
class 类名 implements 接口名{}	
复制代码
  • 接口是用来规范项目体系,提供一些必须的行为规范

接口成员: 在接口内部定义的成员markdown

  • 接口成员只容许有两类
    • 接口常量:const
    • public的接口方法(普通方法和静态方法)
  • 接口的方法为抽象方法,没有方法体(不须要abstract 关键字,由于接口方法都是抽象方法)
  • 实现接口的类:
    • 能够访问接口的常量:接口常量不能被重写
    • 须要实现全部的接口方法(除非自己是抽象类)
    • 接口方法实现不容许增长控制权限(必须为 public)
  1. 接口成员:接口中只能定义共有抽象方法和接口常量
<?php
interface Humen{
    // 接口常量
    const NAME = '人';
    // 接口抽象方法
    public function eat();
    public static function show();
}
复制代码
  1. 接口成员方法必须被实现的子类实现或类为抽象类,接口常量能够直接在实现类中使用
// 实现接口:实体类
class Man implements Humen{
    // 必须实现接口里的全部的抽象方法
    public function eat(){
        // 能够访问常量
       echo self::NAME;
    }
    public static function show(){}
}

// 实现接口:抽象类
abstract class Women implements Humen{};
复制代码
  1. 类实现接口成员时,不容许重写接口中的常量,不容许增长接口方法的控制权限
class Women implements Humen{
    // 不容许重写接口常量
    const NAME = '小孩';
    // 不容许使用其余访问修饰符,必须使用public
    private function eat();
};
复制代码

接口继承: 接口能够被接口继承函数

  • 接口继承接口的目的
    • 实现接口成员的扩展,丰富接口内容,从而实现更好的对实现类的规范
    • 为了造成完整的接口体系,让不一样级别的类实现不一样级别的接口
  • 接口能够一次性继承多个接口
interface A{}
 interface B{}
 
 // 接口继承
 interface C extends A{}
 // 接口多继承
 interface D extends A,B{}
复制代码

总结:ui

  • 接口能够继承接口,并且是多继承
  • 接口是在大型项目中,为了保证底层的实现而设计的规范,一般是抽象类实现接口,增长必要成员属性,而后让实际业务类去继承抽象类
  • 类在继承其余类的时候能够同时去实现相应的接口,不须要父类和接口有任何关系

接口和抽象的区别

  • 抽象类中能够有非抽象方法,而接口中只能有抽象方法
  • 一个类能够实现多个接口,而一个类只能继承一个抽象方法
  • 接口的使用方式经过 implements实现,而抽象类使用extends 关键字继承。
  • 抽象类中能够声明成员变量,而接口中不能声明成员变量,但能够声明常量。
  • 接口没有构造函数,而抽象类能够有构造函数
  • 接口中的抽象方法只能使用public来修饰,而构造方法能够使用public和protected来修饰
  • 抽象类的抽象方法要使用abstract 来修饰,而接口不须要