1
前面我们介绍了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方法那么会造成致命错误

旧梦发癫
678 声望76 粉丝

PHP、Golang