php trait 多继承问题

php trait 多继承问题

简介

php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,

php 从5.4出了Trait这个特性

注意事项

  • Trait类不能实例化
  • Trait类里面的方法只能使用public权限

例:

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

运行结果

image-20200526212614173

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

运行结果

image-20200526220225038

猜你喜欢

转载自www.cnblogs.com/makalochen/p/12969265.html