抽象类
抽象类本质上也是类,只不过他是一个特殊的类,符号为abstract
abstract class AbstractClass{
//强制子类要执行这些方法,并且抽象方法都不能有实体,则不能写大写括号{}
abstract protected function();
//他可以有普通属性,方法。接口只能声明常量,不能有属性,方法。
}
官方文档
- 定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。(抽象类可以没有抽象方法,但是抽象类依然不能被实例化)被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现
- 继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
抽象类可以有成员属性。
有人问:抽象方法是否可以定义为私有,答案是不可以,因为抽象接口的目的就是为了抽象出类模型用来继承,定义为私有,外部访问不到,偏移了设计目的。如下会报错
抽象类可以实现接口,且可以不实现其中的方法(后面接口的实现中有代码)
接口
interface Play{
//可以定义常量,不能定义属性和方法
const LEVEN = 10;
public function PlayLOL();
public function PlayFootball();
}
- 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
- 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
- 接口中定义的所有方法都必须是公有,这是接口的特性,protected和private会报错(Fatal error: Access type for interface method)。
接口的实现,使用implements ,非抽象类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
class Student implements Play{
//so something
}
当类中同时有继承和实现接口时,
class Student extends Human implements Play{//注意位置的顺序
//do something
}
区别:
- 抽象类的实现使用extends,接口的实现使用implements
- 一个类可以继承多个接口,但只能继承一个抽象类
- 抽象类可以使用private,protected,public.而接口只能使用public
- 抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量