什么是 Trait
官网是这么介绍的
大致和继承一样,在一个类中引用其他的类的方法,但是可以避免MiXin
的问题
优先级
从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
区别
Class
可以被实例化,但是Trait
不行Class
如果遇到类C继承类B,类B继承类A,这样的话每一次都需要写一个继承关系,但是一旦一个类的类型是Trait
,那么这个类的方法就可以直接被使用,而不需要直接继承
总结一句话,
Trait
修饰的类不需要写implements
来被子类继承
案例
class Say{
public function sayHello(){
echo 'hello';
}
}
// 这里如果 sinmu 类需要使用 Say 这个类的方法,
// 也就是如下方式
class Sinmu extends Say{
}
$sinmu = new Sinmu();
$sinmu->sayHello();
// output: hello
如果使用 Trait
的话,那么就是如下代码
trait Say{
public function sayHello(){
echo 'hello ';
}
}
class Eat{
public function eatWord(){
echo 'word ';
}
}
class Sinmu extends Eat {
use Say;
}
$sinmu = new Sinmu();
$sinmu->sayHello();
$sinmu->eatWord();
// output: hello word
或许会问,都是调用,谁比谁高尚呢?
但是一个东西的诞生一定是为了解决另一个问题的。
如果存在以下继承关系,类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C,c++那边会出现编译报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lDnf3ia-1640604191732)(images/2021-12-27-19-13-54.png)]
java 和 php 只支持单继承,java可以通过接口的方式实现多继承。而 php 的 trait 就有了用处,可以在一个类里面使用多个类的方法