trait 超详细解析,附源码

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

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

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

共用的一些属性和方法提取出来做来公共trait类,就像是装配汽车的配件,如果你的类中要用到这些配件,就直接用use导入就可以了,相当于把trait中的代码复制到当前类中.
因为trait不是类,所以不能有静态成员,类常量,当然也不可能被实例化。

如果说:继承可以纵向扩展一个类,那么trait就是横向扩展一个类功能

通俗点讲:trait就是为了代码复用而生
例一:创建两个trait类,并使用。(trait类不仅可以定义方法,也可以定义属性)
trait 超详细解析,附源码
输出结果:
trait 超详细解析,附源码
例二:trait类也可以相互嵌套,一个trait直接使用use引用另一个trait类就行(
此处只需要在例一中的test2类中use test1,并去掉classname 类中对test1的引用,代码如下

trait 超详细解析,附源码
代码输出结果:
trait 超详细解析,附源码
例三、trait类不影响继承父类,但是 如果trait类中存在和父类同名的方法时,返回结果为trait类的方法返回值(trait类的优先级比父类高)
trait 超详细解析,附源码
代码执行结果(父类和trait类中都有aa方法的时候,优先使用trait类中的方法):
trait 超详细解析,附源码
例四:当本类,trait类和父类都哈有同名方法时,优先使用本类的方法(优先级 : 本类>trait类>父类)
trait 超详细解析,附源码
输出结果:
trait 超详细解析,附源码
例五:如果两个trait类中含有同名方法
trait 超详细解析,附源码
执行结果:
trait 超详细解析,附源码
解决办法:
trait 超详细解析,附源码
执行结果:
trait 超详细解析,附源码
也可以为同名方法起别名
trait 超详细解析,附源码
执行结果:
trait 超详细解析,附源码