前言:php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性
基本使用:
trait People{
public $name = "man";
public function eat() {
echo "people eat\n";
}
}
class Teacher {
use People;
}
$t = new Teacher();
$t->eat();
结果
people eat
当Trait、基类和本类有同名属性或方法时
当trait定义了属性后,类就不能定义同样名称的属性,否则会产生 fatal error,除非是设置成相同可见度、相同默认值
当有相同方法时
结论:Trait中的方法会覆盖 基类中的同名方法,而本类会覆盖Trait中同名方法
使用多个trait的情况
当不同的trait中有着同名的方法或属性,会产生冲突,可以使用insteadof 或 as进行解决,insteadof 是进行替代,而as是给它取别名
使用as 可以给原方法改名,但原方法同时保留
as 改名的同时,也可以更改访问权限