Trait中的方法或属性会覆盖基类(如果有继承关系)中的同名的方法或属性,而本类会覆盖Trait中同名的方法,如果本类或基类和Trait有同名属性会冲突报错

基本定义

和class很像。Trait基本定义如下

1
2
3
4
5
6
trait Dog{
public $name="dog";
public function bark(){
echo "This is dog";
}
}

基本使用

只要在类里use之后,就可以使用Trait里的方法

1
2
3
4
5
6
class Cat extends Animal{
use Dog;
public function drive(){
echo "This is cat drive";
}
}

与当前类同名

trait很像继承,所以当当前类与trait类方法同名时候,当前类会覆盖trait方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
trait B
{
public function test()
{
echo 1;
}
}
class A
{
use B;
public function test()
{
echo 2;
}
}

(new A)->test();
// 2

引入多个Trait

用逗号分隔,如果有重名的方法或熟悉使用as取别名 使用insteadof表示替代

1
2
3
4
5
6
7
8
class dog{
use trait1,trait2{
trait1::eat insteadof trait2;
trait1::drive insteadof trait2;
trait2::eat as eaten;
trait2::drive as driven;
}
}

参考文献

PHP之Trait详解