trait定义的类无法实例化,不存在对象。
引用trait的类需要使用use关键字,调用多个trait类的方法时使用' , '隔开。
当方法重名时,引用trait的类的方法的优先级低于引用它的类的本身的方法,高于该类继承的父类的方法。
当方法名在同是trait的类中重名时,若同时在一个类中调用多个trait类中但其中有方法重名时会报错。
想要解决第四条的问题有以下方法,可以用insteadof指定调用的trait类,也可以使用as为类的方法其别名。
//trait 代码复用(以插件的方式插入一个类中) //trait 工作于上下文环境,它是位于父类与子类之间的 //trait的优先级高于父类,低于子类 //以下示例的优先级——Bus>Func1>Auto trait Func1 { //驾驶 public function drive() { return '支持无人驾驶'; } //保养 public function care() { return '保养其实很简单,只要及时充电就行了。'; } //事故处理 public function accident() { return '汽车会自动报警,你就在汽车里坐着等警察吧。'; } } trait Func2 { //新能源 public function fuel() { return '新能源汽车'; } //事故处理 public function accident() { return '只要不起火,电池还能继续使用的,放心吧。'; } } class Auto { public $brand;//*** public $purpose;//用途 //构造器 public function __construct($brand, $purpose) { $this->brand = $brand; $this->purpose = $purpose; } //保养 public function care() { return "请到授权的4S店保养。"; } } //定义一个子类,工作类:Bus class Bus extends Auto { //子类除了可以继承Bus中的成员,还可以导入trait类中的方法 // use Func1; // use Func2; //命名冲突的解决方法无非两种:替换,别名 use Func1,Func2{ Func1::accident insteadof Func2;//用Func1中的方法替换Func2中的方法,Func2中的方法将无法被执行,只执行Func1中的方法 Func2::accident as accident2;//对Func2起别名 } //定义一个care方法,这个方法在Auto父类中存在 // public function care() // { // return "我们是***商,保养请致电当地经销商"; // } } //实例化Bus $bus = new Bus('安凯', '客运'); echo $bus->brand . '<br>'; echo $bus->purpose . '<br>'; //访问trait中的方法 echo $bus->drive() . '<br>'; echo $bus->fuel() . '<br>'; //访问care方法 echo $bus->care() . '<br>'; //访问重名方法accident echo $bus->accident().'<br>'; echo $bus->accident2().'<br>';