PHP5.4以后实现了一个新的代码复用的方法Trait,Trait为了减少单继承语言的限制,相对于传统继承增加了水平特性的组合,也就是说几个class之间不需要继承。
Trait不是类,不能被实例化,Trait中的代码可以使用use直接导入到类中,相当于把trait的代码复制到当前类中。
实例:
<?php
trait play
{
public function football()
{
return 'trait foot ball';
}
}
class sport
{
// 使用use关键字使用trait play中的代码
use play;
}
$o = new sport;
$o->football();
一、优先级
从基类继承的成员会被trait插入的成员覆盖,优先顺序:当前类成员 > trait类成员 > 基类成员
二、使用多个Trait
通过逗号分隔,在use声明列出多个Trait,可以都插入到一个类中。
<?php
trait playBall
{
public function football(){}
}
trait playTools
{
public function piano(){}
}
class sport extends ball
{
use playBall, playTools;
}
三、冲突的解决
如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以为某个方法引入别名。注意,as 操作符不会对方法进行重命名,
也不会影响其方法。
<?php
trait playBall
{
public function football(){}
}
trait playTools
{
public function football(){}
}
class sport
{
use playBall, playTools {
// 用playTools中的football方法替换掉playBall中的football的方法
playTools::football insteadof playBall;
// 给playBall的football方法一个别名
playBall::football as Ball;
}
}
四、Trait与Trait的组合
Trait中也可以使用Trait,在Trait定义时可以使用一个或者多个Trait
trait playBall
{
public function football()
{
return 'trait foot ball';
}
}
trait playTools
{
use playBall;
public function piano()
{
return 'trait piano';
}
}
另外,PHP中的use的用法:
- 命名空间
- 匿名函数
- Trait引用
网友评论