trait Cat { public function catEat() { // parent::sayHello(); echo '吃鱼!'; } public function catHobby() { // parent::sayHello(); echo '爱捉老鼠!'; }}trait Dog { public function dogEat() { echo '吃骨头!'; } public function hobby() { // parent::sayHello(); echo '看家护院!'; }}class Pets { use Cat,Dog; public function info() { echo 'Pets!'; }}$o = new Pets();$o->info();echo "<br/>" ; // Pets!$o->catEat(); // 吃鱼!echo "<br/>" ;$o->dogEat(); // 吃骨头!echo "<br/>" ; // Pets!// 吃鱼!// 吃骨头!
冲突的办理
如果两个 trait 都插入了一个同名的方法,如果没有明确办理冲突将会产生一个致命缺点。 为理解决多个 trait 在同一个类中的命名冲突,须要利用 insteadof 操作符来明确指定利用冲突方法中的哪一个。 以上办法仅许可打消掉其它方法,as 操作符可以 为某个方法引入别名。 把稳,as 操作符不会对方法进行重命名,也不会影响其方法
实例:trait Cat { public function eat() { // parent::sayHello(); echo '吃鱼!'; } public function hobby() { // parent::sayHello(); echo '爱捉老鼠!'; }}trait Dog { public function eat() { echo '吃骨头!'; } public function hobby() { // parent::sayHello(); echo '看家护院!'; }}class Pets { use Cat,Dog{ Cat::eat insteadof Dog; // cat .eat 替代 DOG.eat Dog::hobby insteadof Cat; // hobby 继续 DOG } / use Cat,Dog{ Cat::eat as cEat; // 将 重名的方法 设置不重名 Dog::hobby as cHobby; } / public function info() { echo 'Pets!'; }}$o = new Pets();$o->info();echo "<br/>" ;$o->eat();echo "<br/>" ;$o->hobby();echo "<br/>" ;//Pets!// 吃鱼!// 看家护院!
把稳:
Trait 定义了一个属性后,类就不能定义同样名称的属性,否则会产生 fatal error。 有种情形例外:属性是兼容的(同样的访问可见度、初始默认值)。
trait PropertiesTrait { public $same = true; public $different = false;}class PropertiesExample { use PropertiesTrait; public $same = true; public $different = true; // 致命缺点}
更多的详细语法详见官方文档 : 地址(https://www.php.net/manual/zh/language.oop5.traits.php)
