定义 : 为类似PHP的单继承语言准备的一种代码复用机制
- 可以被类引入,被提供公共代码让共性类引入,让某些不同类型的类具有公共的方法
- trait结构类似于类 : 有属性和方法(包含抽象方法),不能有类常量
一个类可以引用多个trait
trait同名 :属性同名 : 不允许出现
- 方法同名 :
- 不允许同名,使用替代方案,确定要使用哪个
use trait1,trait2{
trait1::方法名 insteadof trait2;
}
- 允许同名,先声明一个trait可以使用,其他的使用别名
use trait1,trait2{
trait1::方法名 insteadof trait2;
trait2::方法名 as 别名;
}
trait控制权 :
- 可以使用as直接修改权限
use trait{
方法名 as 访问修饰符;
}
- 可以使用起别名的方式修改控制权,原名仍可使用,并且权限和之前相同
use trait{
方法名 as 访问修饰符 别名;
}
trait优先级: 在引入的过程中可能存在类本身或者父类拥有同名的成员
- 同名方法系统认定为重写,优先级为 : 子类 > trait >父类
- 子类父类和trait有同名方法时,子类使用parent访问到的是父类的的方法
<?phpclass person{public $name;public $age;public function __construct($name,$age){$this->name=$name;$this->age=$age;}public function play($game){return $this->name."玩{$game}";}}// 定义traittrait work{public function make($name){return "我在工作,工作内容是: {$name}";}}trait sleep{public function shui($time){return "每天睡觉{$time}小时";}public function make($hour){return "每天晚上{$hour}点睡觉";}public function play($name){return "晚上睡不着觉,偷偷摸摸玩{$name}";}}// 子类class son extends person{// 子类中 使用trait 多个使用逗号连接// 多个trait中拥有同名方法 产生冲突use work,sleep{// insteadof 而不是// 使用work的make方法 而不是sleep的work::make insteadof sleep;// 给其他同名方法起别名sleep::make as make2;}public function play($name){return "我是孩子,在家里玩{$name}";}}$li=new son("李四",20);echo $li->make("敲代码"); // 来自于workecho "<br>";// 父类+子类+trait中拥有同名方法时// 优先级别 子类 > trait > 父类echo $li->play("泥巴"); // 继承于父类echo "<br>";echo $li->shui(12); // 来自于sleepecho "<br>";echo $li->make2(11); // 来自于sleep 使用别名调用
