php trait 多继承问题
# php trait 多继承问题
简介
php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,
php 从5.4出了Trait这个特性
注意事项
- Trait类不能实例化
- Trait类里面的方法只能使用public权限
trait的优先级
优先级:自身方法>trait的方法>继承的方法(就是这样子的。)
使用示例
例:
<?php
trait A{
public function aa(){
return 'aaa';
}
}
trait B {
public function bb(){
return 'bb';
}
}
class User{
public function hello(){
return 'hello';
}
}
class VipUser extends User{
use A;
use B;
public function hello2(){
return 'hello2';
}
//重写
public function aa(){
return 'AAAAA';
}
}
$vip = new VipUser();
echo $vip->aa();
echo $vip->bb();
运行结果
多个trait里面方法重名冲突问题
当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
例:
<?php
class User {
public function hello() {
return 'hello';
}
}
trait B {
public function bb() {
return 'bb';
}
}
trait A {
public function aa() {
return 'aaa';
}
public function bb() {
return 'BBBBB';
}
}
class VipUser extends User {
use A,B{
// 如果调用的方法名为bb则,我们B中的方法指向到A中,
// 而自己本身的bb方法则修改为bbb然后指向到自己的内容
A::bb insteadof B;
B::bb as bbb;
}
public function hello2() {
return 'hello2';
}
}
$vip = new VipUser();
echo $vip->bb();
echo $vip->aa();
运行结果