Trait优先级
当类之间有继承关系并且引入了Trait,Trait在引入过程中可能与类本身或者父类拥有同名成员。当出现同名属性时,必须保证同名同值,否则程序报错;当出现同名方法时,系统会认定为重写,调用的优先级为“子类 > Trait > 父类”。
接下来演示子类、Trait和父类中存在同名方法时调用的优先级,具体代码如下。
1 trait Eat
2 {
3 public function eat()
4 {
5 echo 'Eat::eat';
6 }
7 }
8 class Human
9 {
10 public function eat()
11 {
12 echo 'Human::eat';
13 }
14 }
15 class Man extends Human
16 {
17 use Eat;
18 public function eat()
19 {
20 Echo 'Man::eat';
21 }
22 }
23 $man = new Man();
24 $man->eat(); // Man::eat
在上述代码中,分别定义了Trait和Human类,通过Man类继承和引用,在Man类中定义了同名eat()方法。第23、24行代码实例化Man类并调用eat()方法。从输出结果可以看出,优先调用子类方法,如果将Man类中的eat()方法删除,则第24行输出结果为Eat::eat,说明调用的是Trait中的方法,如果想要使用父类方法,则使用parent关键字进行调用即可。