PHP 特性之 trait (二)

前面我们介绍了Trait的基本使用,下面来介绍下Trait比较复杂的用法
使用多个Trait
trait Member
{
    public  function info()
    {
        echo 'this is trait,';
    }

}
trait Admin
{
    public function show()
    {
        echo  'this is admin,';
    }

}


class ShowMember
{
    use Member,Admin;

}
$Member = new ShowMember();
$Member->info();
$Member->show();

直接使用,逗号隔开,以上程序将会输出this is trait,this is admin,

命名冲突
如果使用了多个Trait,并且多个Trait中的命名有重复,那么这个时候就会产生一个致命的错误。为了正确的使用这些Trait,我们需要用 insteadof来调用这些同名的方法。

trait Member
{
    public  function info()
    {
        echo 'this is member info,';
    }

    public function show()
    {
        echo 'this is member show,';

    }

}
trait Admin
{
    public function info()
    {
        echo  'this is admin info,';

    }

    public function show()
    {
        echo  'this is admin show,';
    }

}


class ShowMember
{
    use Member,Admin{
        Member::info insteadof Admin;//使用 Member 的info 方法来替代 Admin 的info方法
        Admin::show insteadof Member;//使用 Admin 的show 方法来替代 Member 的show方法
    }

}
$Member = new ShowMember();
$Member->info();
$Member->show();

以上程序将会输出this is member info,this is admin show,。这个时候使用了insteadof来声明了,我需要使用哪个Trait中的方法。避免的冲突引起的错误。

Trait的抽象成员
Trait和普通的类一样,也是成员变量的,也可以定义抽象方法来强制要求。
trait Member
{
    public  function info()
    {
        echo 'this is member info,';
    }

    abstract public function show();

}



class ShowMember
{
    use Member;
    public function show()
    {
        // TODO: Implement show() method.
    }


}
$Member = new ShowMember();
$Member->info();
Trait的静态成员
Trait 同样是可以静态成员变量的
trait Member
{
    public  function info()
    {
        echo 'this is member info,';
    }

    public static $_a = 1;
    public function show()
    {
        echo self::$_a;
    }

}



class ShowMember
{
    use Member;

}
$Member = new ShowMember();
$Member->show();//会输出1
echo $Member::$_a;//也会输出1
Trait的访问修饰符

上面很多例子可以看到 对Trait的方法,跟属性都是加有 public访问修饰符,是不是就意味着,Trait也可以使用访问修饰符呢,答案是肯定的。但是Trait中的属性跟方法,如果需要被外部的类使用的话,必须为public,即使是protected也是不能被外部的类所使用的。那么如果我需要在外部的类中对该方法进行私有化怎么办呢,下面来看一个列子

trait Member
{
    public static function show()
    {
        echo 'show';
    }


}



class ShowMember
{
    use Member{
        show as private;  //将Trait中的show方法私有化
    }
    public function OutShow()
    {
        Member::show();
    }
}
$Member = new ShowMember();
$Member->OutShow();
//$Member::show(); //这个时候直接调用 show方法那么会造成致命错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值