第七章:第13节 PHP面向对象——traits新特性

更新于:2017-06-07 21:27:13

我们说过了PHP是单继承的语言,一个类只能继承一个父类(一个类只能有一个父亲,可以有很多祖宗),想继承多个类只能是一个类一个类地叠加继承。如果是这样设计的话,类与类之间没有明显的“父子”关系,也不太好。


从PHP5.4版本,PHP 推出了新特性 traits,它可以让PHP的类实现多继承的效果。


手册里面是英文介绍,翻译过来是:


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


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


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


具体用法请看下面的代码:


1.png

1.png

上面的例子中,Student类通过继承Person类,有了eat方法。通过使用(use)新特性trait School,有了attend方法和属性name。


如果Trait、基类(父类)和本类(子类)中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:

1.png

1.png


因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类(父类)中的方法。


如果要组合多个Trait,通过逗号分隔 Trait名称:


use Trait1, Trait2;


总结:关于traits楠神就介绍这么多,楠神做开发时也从没有用过trait,所以这些东西都不常用。尤其对于刚学PHP面向对象的朋友,不用花太多时间先学习这个,只要知道PHP有这么个特性就可以了。


推荐阅读:


http://tabalt.net/blog/php-traits/

http://www.jb51.net/article/61260.htm