博客列表 >trait代码复用

trait代码复用

李明伟的博客
李明伟的博客原创
2019年05月13日 11:29:41910浏览
  1. trait定义的类无法实例化,不存在对象。

  2. 引用trait的类需要使用use关键字,调用多个trait类的方法时使用' , '隔开。

  3. 当方法重名时,引用trait的类的方法的优先级低于引用它的类的本身的方法,高于该类继承的父类的方法。

  4. 当方法名在同是trait的类中重名时,若同时在一个类中调用多个trait类中但其中有方法重名时会报错。

  5. 想要解决第四条的问题有以下方法,可以用insteadof指定调用的trait类,也可以使用as为类的方法其别名。

  6. QQ浏览器截图20190326084936.png


//trait 代码复用(以插件的方式插入一个类中)
//trait 工作于上下文环境,它是位于父类与子类之间的
//trait的优先级高于父类,低于子类
//以下示例的优先级——Bus>Func1>Auto
trait Func1
{
    //驾驶
    public function drive()
    {
        return '支持无人驾驶';
    }

    //保养
    public function care()
    {
        return '保养其实很简单,只要及时充电就行了。';
    }

    //事故处理
    public function accident()
    {
        return '汽车会自动报警,你就在汽车里坐着等警察吧。';
    }
}

trait Func2
{
    //新能源
    public function fuel()
    {
        return '新能源汽车';
    }

    //事故处理
    public function accident()
    {
        return '只要不起火,电池还能继续使用的,放心吧。';
    }
}

class Auto
{
    public $brand;//***
    public $purpose;//用途

    //构造器
    public function __construct($brand, $purpose)
    {
        $this->brand = $brand;
        $this->purpose = $purpose;
    }

    //保养
    public function care()
    {
        return "请到授权的4S店保养。";
    }
}

//定义一个子类,工作类:Bus
class Bus extends Auto
{
    //子类除了可以继承Bus中的成员,还可以导入trait类中的方法
//    use Func1;
//    use Func2;

//命名冲突的解决方法无非两种:替换,别名
use Func1,Func2{
    Func1::accident insteadof Func2;//用Func1中的方法替换Func2中的方法,Func2中的方法将无法被执行,只执行Func1中的方法
    Func2::accident as accident2;//对Func2起别名
}

    //定义一个care方法,这个方法在Auto父类中存在
//    public function care()
//    {
//        return "我们是***商,保养请致电当地经销商";
//    }
}

//实例化Bus
$bus = new Bus('安凯', '客运');
echo $bus->brand . '<br>';
echo $bus->purpose . '<br>';

//访问trait中的方法
echo $bus->drive() . '<br>';
echo $bus->fuel() . '<br>';

//访问care方法
echo $bus->care() . '<br>';

//访问重名方法accident
echo $bus->accident().'<br>';
echo $bus->accident2().'<br>';


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议