php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性
用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化
如下代码实例:
drive();echo "";$cat->eat();echo "";$cat->bark();?>
将会如下输出
再测试Trait、基类和本类对同名属性或方法的处理,如下代码
drive();echo "";$cat->eat();?>
所以:Trait中的方法或属性会覆盖 基类中的同名的方法或属性,而本类会覆盖Trait中同名的属性或方法
一个类可以组合多个Trait,通过逗号相隔,如下
use trait1,trait2
当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
如下实例:eat();echo "";$cat->drive();echo "";echo "";echo "";$dog = new dog();$dog->eat();echo "";$dog->drive();echo "";$dog->eaten();echo "";$dog->driven();?>
输出如下
as 还可以修改方法的访问控制
eat();//报错,因为已经把eat改成了保护$cat = new Cat();$cat->eat();//正常运行,不会修改原先的访问控制$cat->eaten();//报错,已经改成了私有的访问控制?>
Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等,实例如下
getName();echo "";$animal->eat();echo "";$animal->drive();echo "";$animal::say();echo "";$animal->test();echo "";$animal->test();?>
输出如下
最常见的应用场景就是将底层的curd用trait封装,然后在控制器中调用即可
参考文章:https://zhuanlan.zhihu.com/p/81123521