1、trait同名方法的命名冲突解决以及trait中改变trait成员的访问控制
<?php trait tDemo1 { public function index() { echo __TRAIT__ . '=====>' . '首页'; } } trait tDemo2 { public function index() { echo __TRAIT__ . '=====>' . '首页'; } } trait tDemo3 { public function update() { echo __TRAIT__ . '====>' . '更新'; } } trait tDemo4 { use tDemo1, tDemo2 { // 1. 替代 tDemo1::index insteadof tDemo2; //2.重命名 tDemo2::index as in2; } //修复访问权限 use tDemo3 { update as protected up; } } class User { use tDemo4; } //客户端 $user = new User; $user->index(); echo '<br>'; $user->in2(); echo '<br>'; $user->up(); echo '<br>';
2.trait与抽象类、接口联合编程
<?php interface iDemo { public function sayHello(); public function sayWord(); } trait tDemo { public function sayByebye() { echo 'ヾ(ToT)Bye~Bye~<br>'; } } abstract class aDemo implements iDemo { public function sayHello() { echo 'Hello<br>'; } } class MyHelloWorld extends aDemo { use tDemo; public function sayWord() { echo 'Word<br>'; } } $my = new MyHelloWorld; $my->sayByebye(); $my->sayHello(); $my->sayWord();
总结:trait同名冲突时有两种解决办法,一种是通过替代的方式来解决;另外一种是把其中一个方法的进行更名。
使用trait时也可以进行相应的访问权限的变更。
接口、抽象类、trait混合编程时,可以在接口中声明方法,然后抽象类中选择实现全部或者部分方法;trait则方便的实现了代码复用,一些常用的功能就可以放到trait中,需要使用时直接引入trait就行。