<?php
    /*
     * 实现多继承
     * 用法:通过在类中使用use 关键字,声明要组合的Trait名称,
     * 具体的Trait的声明使用Trait关键词,Trait不能实例化
     * 常量无法定义
     */
    trait Dog{
        public $name='dog';
        public function bark(){
            echo "This is dog";
        }
    }
    class Animal{
        public function eat(){
            echo "This is animal eat";
        }
    }
    class Cat extends Animal{
        use Dog;
        public function dirve(){
            echo "This is cat dirve";
        }
    }
    $cat=new Cat();
    $cat->dirve();
    echo "<br/>";
    $cat->eat();
    echo "<br/>";
    $cat->bark();
?>

对Trait函数重函数名字的测试

<?php
    trait dog{
        public function run(){
            echo "我是狗在跑";
        }
    }
    trait cat{
        public function run(){
            echo "我是猫在跑";
        }
    }
    class animal{
        //当继承多个trait类中有重名的函数的话
        #方案1使用其中一个方法(同名)
        use dog,cat{
            #确定用哪一个,调用dog的run insteadof(代替) cat
            dog::run insteadof cat;
        }
    }
    //访问
    $m=new animal();
    $m->run();
?>

方案二改名。

<?php
    trait dog{
        public function run(){
            echo "我是狗在跑";
        }
    }
    trait cat{
        public function run(){
            echo "我是猫在跑";
        }
    }
    class animal{
        //当继承多个trait类中有重名的函数的话
        //方案二 改名
    use dog,cat{
        dog::run insteadof cat;
        cat::run as runcat;
        dog::run as rundog;
    }
    }
    //访问
    $m=new animal();
    $m->runcat();//猫跑
    $m->rundog();//狗跑
    $m->run();//狗跑
?>

方法重写trait继承的类
问题:重写同名覆盖问题

<?php
trait man{
    public $name='男';
    public function show(){
        echo "man show";
    }
}
class woman{
    use man;
    public function show(){
        echo 'woman show';
    }
}
$ren=new woman();
$ren->show();

?>

dvZRTx.png

假设继承父类与trait同时存在同一个方法

<?php
class Human{
    //定义父类
    public function show(){
        echo '我是父类';
    }
}
trait Walk{
    public function show(){
        echo '我是tarit的walk';
    }
}
//我是子类继承父类并且use walk。
class son extends Human{
    use Walk;
}
$S=new son();
$S->show();
?>

结果:我是tarit的walk
也就是说trait与继承父类同时存在 在一个子类中时,并且都有相同的方法那么trait将会覆盖继承中的方法,