定义 : 为类似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访问到的是父类的的方法
<?php
class person{
public $name;
public $age;
public function __construct($name,$age)
{
$this->name=$name;
$this->age=$age;
}
public function play($game)
{
return $this->name."玩{$game}";
}
}
// 定义trait
trait 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("敲代码"); // 来自于work
echo "<br>";
// 父类+子类+trait中拥有同名方法时
// 优先级别 子类 > trait > 父类
echo $li->play("泥巴"); // 继承于父类
echo "<br>";
echo $li->shui(12); // 来自于sleep
echo "<br>";
echo $li->make2(11); // 来自于sleep 使用别名调用