Trait控制权
在类中引入Trait时,可以根据需求来修改Trait中对应方法的控制权,修改方法的控制权后只对当前引入Trait的类有效,修改权限的语法结构如下所示。
1 trait trait名字
2 {
3 protected function 方法名() {}
4 }
5 class 类名
6 {
7 use trait名字 {
8 方法名 as 访问修饰限定符;
9 }
10 }
从上述语法可以看出,使用as关键字可以修改Trait方法的控制权,但是as关键字也可以对Trait方法设置别名。
接下来演示对Trait方法修改控制权并设置别名,具体代码如下所示。
1 trait t1
2 {
3 public function sleep()
4 {
5 echo 'sleep';
6 }
7 }
8 class Person
9 {
10 use t1 {
11 sleep as private s;
12 }
13 }
14 $person = new Person();
15 $person->s(); // Fatal error: Uncaught Error:Call to private...
16 $person->sleep(); // sleep
上述代码中,通过在Person类中引入Trait,将sleep()方法设置为私有并重命名为s(),实例化Person类调用s()方法,别名后的s()方法是私有化的,类外不能调用,所以程序运行会报错。第16行调用sleep()方法可以正常输出,别名修改控制权后,只对别名后的方法有效,不会对原有Trait中的方法和访问修饰限定符修改。