zoco

php中的trait

2018-12-03


为什么要使用trait?

先来看一个情景,如果想要写一个继承模型该怎么做。

最常见的一种时创建一个父类,让子类来继承父类。这个方法有一个问题,就是有可能子类之间是无关的,只是为了继承而写在一起,逻辑上说不通。

第二种是创建一个接口,然后类来实现这个接口,这种方法比第一种方法要好,但是在两个类中有可能会重复实现相同的功能,违背了DRY原则(Don’t Repeat Yourself)。

最后也是最好的一种方法就是创建trait,定义并实现公有的方法,然后需要的时候混入这个trait即可。这么做不会搅乱子类原有的自然继承层次结构。

PHP解释器在编译时会把trait复制粘贴到类的定义体中,但是不会处理这个操作引入的不兼容问题。如果trait假定类中有特定的属性活着方法(在trait中没有定义),要确保相应的类中有对应的属性和方法。