1.抽象类

定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。
这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

abstract class AbstractClass ....
class ConcreteClass2 extends AbstractClass
  1. interface 接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

interface iTemplate
class Template implements iTemplate

3.trait

Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class
组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait
自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

trait ezcReflectionReturnInfo
class a{use ezcReflectionReturnInfo;}

其实最重要的是下面的几句话 --2333@(小乖)

把这三个一对比,你可以发现,实际他们就在解决代码重用的问题。
而interface更像是模板,里面只需要写有什么方法,而使用接口的,就必须遵循我的规范,要实现我提供的所有的方法;
而abstract 包含了interface功能,有abstract的方法,在继承后就要去重写,遵循它,但是参数可以多出来
没有abstarct的方法就可以继承直接使用
trait 嘛,就跟class相似了,不需要继承,使用use就可以直接使用。而且
优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

php

版权属于:染念
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2020年04月15日 15:03
0
发表评论


179 文章数
668 评论量
4 分类数
183 页面数
已在风雨中度过 7年46天20小时51分
目录
来自 《php中的abstract,interface,trait》
© 2024 染念Blog
浙ICP备19020194号-1
暗黑模式
暗黑模式
评论
返回顶部
© 2024 染念Blog
浙ICP备19020194号-1
暗黑模式
暗黑模式
评论
返回顶部