简介

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();

运行结果

php trait 多继承问题

多个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();

运行结果

php trait 多继承问题

参考:https://www.php.net/manual/zh/language.oop5.traits.php

相关文章:

  • 2018-03-27
  • 2021-12-06
  • 2022-01-07
  • 2021-07-27
  • 2022-12-23
  • 2022-12-23
  • 2021-12-29
猜你喜欢
  • 2021-09-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-17
相关资源
相似解决方案