<?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();
?>
假设继承父类与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将会覆盖继承中的方法,