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

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP接口(interface)和抽象类(abstract)的区别相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

接口和抽象类,在php中是个很重要的概念,在面向对象的编程中,这两个是很常见的,所以想要学号php,这两个的区别需要弄清楚,将会让你在学习的道路上更加的得心应手,如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

目录

一、抽象类

二、抽象类注意

三、接口

四、两者共同点

五、两者区别


一、抽象类

  •  抽象类是指在 class 前加了 abstract 关键字且存在抽象方法的一种类
  • 抽象类不能被直接实例化
  • 抽象类中只定义(或部分实现)子类需要的方法
  • 子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化
  • 子类需要实现抽象类中的所有抽象方法
  • 如果子类不想实现抽象类中的所有抽象方法,那么该子类也必须定义为一个抽象类
<?php
abstract class A
{
    /** 可以定义变量 **/
    protected $http_success_code = 0;
    protected $http_error_code = 1;

    /** 可以定义非抽象方法 **/
    public function name()
    {
        echo 'hello,my name is autofelix';
    }

    /** 至少含有一个抽象方法 **/
    abstract protected function age();
}

//如果不想实现age方法,必须子类也是抽象类,否则会报错
abstract class C extends A {}

二、抽象类注意

  • 子类实现抽象类的时候,限定修饰符的权限一定要高于等于抽象类中的权限
<?php
abstract class A
{
    abstract protected function age();
}

//定义使用protected,如果用private将会报错,但是可以用public/protected
class B extends A
{
    private function age() {}
}

三、接口

  • 接口用关键字 interface 来声明
  • 接口只定义功能,而不包含实现的内容
  • interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法
  • 虽然 interface 却可以声明常量变量,但是不提倡,因为这违背了接口用处的宗旨
  • 接口不可以实现另一个接口,但可以继承多个
  • 一个类可以同时继承一个父类和实现任意多个接口
<?php
interface A
{
    const NAME = 'autofelix';

    public function name();

    public function age();
}

interface B
{
    const NAME = 'butofelix';

    public function name();

    public function age();
}

class C {}

class D extends C implements A,B
{
    public function name()
    {
        // TODO: Implement name() method.
    }

    public function age()
    {
        // TODO: Implement age() method.
    }
}

四、两者共同点

  • 两者都是抽象类,都不能实例化
  •  interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法

五、两者区别

  • interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends
  • 一个类可以实现多个 interface ,但一个类只能继承一个 abstract class
  • interface 强调特定功能的实现,而 abstract class 强调所属关系
  •  接口中的方法默认都是public类型的,而抽象类中的方法可以使用private、protected、public来修饰
  • 抽象类中可以有非抽象的方法而接口中只能够有抽象的方法
  • 接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装
  • 接口没有构造函数,抽象类可以有构造函数

以上是关于PHP接口(interface)和抽象类(abstract)的区别的主要内容,如果未能解决你的问题,请参考以下文章

在谈PHP中的 抽象类(abstract class)和 接口(interface)

PHP 进阶之 抽象类(abstract)接口(interface)Trait(特征)

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

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

AJPFX简述abstract class和interface的区别

对php的接口类与抽象类的理解