Trait类代码复用

Trait的作用

Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

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

 Trait的使用方法

用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化

trait demo1
    {
        public function  hello1()
        {
            return __METHOD__;
        }
    }

    trait demo2
    {
        public function hello2()
        {
            return __METHOD__;
        }
    }


    class demo 
    {
        use demo1,demo2;

        public function hello()
        {
            return __METHOD__;
        }

    }

    $d = new demo();
    echo $d->hello();
    echo $d->hello1();
    echo $d->hello2();

Trait 的优先级问题

如果使用的Trait中的一个方法名称和父类的方法名重名怎么办?或者和调用类本身的方法名重名,或者引入了两个Trait,这两个Trait有相同的方法名称等等这些问题

1、 使用的Trait中的一个方法名称和父类的方法名重名

<?php
    trait demo1
    {
        public function  hello()//trait方法
        {
            return __METHOD__;
        }
    }


    class Fdemo{ 
        public function hello()//父类方法
        {
            return __METHOD__;
        }
    }

    class demo extends Fdemo
    {
        use demo1;


    }

    $d = new demo();
    echo $d->hello();//调用重名的方法

运行结果:

结论:trait类优先级高于父类

 

2、和调用类本身的方法名重名

trait demo1
{
    public function hello()//trait方法
    {
        return __METHOD__;
    }
}

class demo
{
    use demo1;
    public function hello()
    {
        return __METHOD__;
    }

}

$d = new demo();
echo $d->hello();//调用重名的方法

运行结果:

结论:类本身的优先级高于所使用的Trait类

3、引入了两个Trait,这两个Trait有重名的方法

<?php
    trait demo1
    {
        public function  hello()
        {
            return __METHOD__;
        }
    }

    trait demo2
    {
        public function hello()
        {
            return __METHOD__;
        }
    }


    class demo 
    {
        use demo1,demo2{
            demo1::hello insteadof demo2;
            demo2::hello as hello2;
        }
        public function hello()
        {
            return __METHOD__;
        }

    }

    $d = new demo();
    echo $d->hello();
    echo $d->hello2();

两个Trait类有重名的方法,调用这个方法的时候是会报错的,可以用 as 起个别名或者insteadof 替换的方法解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值