PHP抽象类与接口的区别

抽象类 abstract

  • 定义为抽象类不能被实例化。任何一个方类,如果它里面至少有一个方法是被声明为抽象的,那么这个类必须被声明为抽象类。(抽象类可以没有抽象方法)被定义为抽象方法只能做声明不能有具体的实现。

例:


abstract class A { //强制子类必须定义 abstract function setName(); abstract function setSex($sex); function getName() { return ''; } }
  • 继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
  • 继承一个抽象类的时候,子类调用方式必须匹配,即类型和所需参数数量必须一致
  • 抽象类可以有成员属性(接口不能定义)
  • 抽象方法不可以定义为私有
  • 抽象类可以实现接口,且可以不实现其中的方法(但是子类必须实现,接口不能继承抽象类只能继承接口)
interface A
{
    function getSex();
}

abstract class B implements A
{
    abstract public function getAge();
}

class C extends B
{
    public function getSex()
    {
        var_dump('name');
    }

    public function getAge(){
        var_dump('age');
    }
}

$obj = new C();
$obj->getSex();
  • 抽象类可以继承抽象类,且不能重写抽象父类的抽象方法。

接口 interface

  • 接口是方法的抽象,如果不同的类有同样的方法,那么就应该考虑使用接口。
  • 接口可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
  • 接口中定义的所有方法都必须是公有,这是接口的特性。
  • 常量:接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
  • 实现多个接口时,接口中的方法不能有重名。
  • 接口也可以继承,通过使用 extends 操作符。(接口不能继承抽象类)
鲁ICP备16017569号-2