前面我们介绍了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方法那么会造成致命错误
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。