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)的区别