traits:
它使得类里面的代码(主要指属性和方法)更加灵活的被复用
traits 和 include的有点相似
- 通过include技术我们可以引入文件
- 通过traits技术我们可以引入代码
实际使用:
在很多个类中如果有一些方法复用时,我们能做的只能是把这些重复的方法放在他们共同的父类中,但是这些类已经有父类了怎么办?
没有办法使一个类同时继承多个类,这样我们对于这些需要重复使用的方法就没办法自由的编写了,如果给他们不同的父类加上这些
方法,就会有很多重复的代码,不利于后期维护!
1)用traits技术解决这个问题
trait trait名称{
需要重复使用的方法可以放在这里,和类里面编写的方法一样;
}
注:trait名称最好以 t 开头
trait tKnife{
public function pencil($pencil){
echo $pencil.'ok!';
}
}
2)trait使用方法
在类的内部使用:
use trait 名称
即可使用被use的trait里面的各种方法,类似于include
3)优先级
从基本类继承的成员被trait插入的成员所覆盖,优先顺序是来自当前类的成员覆盖了trait的方法,而trait则覆盖了被继承的方法
4)通过逗号分隔,在use声明列出多个trait,可以插入到一个类中
use trait 名称1,trait 名称2;
5)冲突的解决
如果两个trait都插入了一个同名的算法,如果没有明确冲突将会产生一个致命错误
1.为解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个
trait A{
public function smallTalk(){
echo 'a';
}
public function bigtalk(){
echo 'A';
}
}
trait B{
public function smallTalk(){
echo 'b';
}
public function bigTalk(){
echo 'B';
}
}
class Talker{
use A,B{
B::smallTalk insteadof A;
A::bigtalk insteadof B;
}
}
2.
class Aliased_Talker{
use A,B{
B::smallTalk insteadof A;
A::bigtalk insteadof B;
B::bigTalk as talk;
}
}
//注:在使用as前必须解决掉冲突问题