php类的单继承性,无法同时从两个基类中继承属性和方法,为了解决这个问题,使用Trait特性解决.
Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制.
用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词. 注意:Trait不能实例化
示例:
<?php trait Dog{ public function dog(){ echo 'This trair dog'; } } trait Fish{ public function fish(){ echo 'This trair fish'; } } class Animal{ public function name(){ echo 'This is animal'; } } class Cat extends Animal{ use Dog,Fish; public function eat(){ echo 'This is animal cat eat'; } } $data = new Cat(); $data->name();//This is animal echo '<pre>'; $data->eat();//This is animal cat eat echo '<pre>'; $data->dog();//This trair dog echo '<pre>'; $data->fish();//This trair fish
一个类可以组合多个Trait,通过逗号相隔,如下
use trait1,trait2
当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。
答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。
使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法:
<?php trait Trait1 { public function hello() { echo "Trait1::hello\n"; } public function hi() { echo "Trait1::hi\n"; } } trait Trait2 { public function hello() { echo "Trait2::hello\n"; } public function hi() { echo "Trait2::hi\n"; } } class Class1 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; } } class Class2 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; Trait2::hi as hei; Trait1::hello as hehe; } } $Obj1 = new Class1(); $Obj1->hello(); $Obj1->hi(); echo "\n"; $Obj2 = new Class2(); $Obj2->hello(); $Obj2->hi(); $Obj2->hei(); $Obj2->hehe();