我们说过了PHP是单继承的语言,一个类只能继承一个父类(一个类只能有一个父亲,可以有很多祖宗),想继承多个类只能是一个类一个类地叠加继承。如果是这样设计的话,类与类之间没有明显的“父子”关系,也不太好。
从PHP5.4版本,PHP 推出了新特性 traits,它可以让PHP的类实现多继承的效果。
手册里面是英文介绍,翻译过来是:
自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。
Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。
具体用法请看下面的代码:
上面的例子中,Student类通过继承Person类,有了eat方法。通过使用(use)新特性trait School,有了attend方法和属性name。
如果Trait、基类(父类)和本类(子类)中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:
因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类(父类)中的方法。
如果要组合多个Trait,通过逗号分隔 Trait名称:
use Trait1, Trait2;
总结:关于traits楠神就介绍这么多,楠神做开发时也从没有用过trait,所以这些东西都不常用。尤其对于刚学PHP面向对象的朋友,不用花太多时间先学习这个,只要知道PHP有这么个特性就可以了。
推荐阅读:
http://tabalt.net/blog/php-traits/
http://www.jb51.net/article/61260.htm