PHP5.4以后實現(xiàn)了一個新的代碼復用的方法Trait箩祥,Trait為了減少單繼承語言的限制,相對于傳統(tǒng)繼承增加了水平特性的組合肆氓,也就是說幾個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();
一拨扶、優(yōu)先級
從基類繼承的成員會被trait插入的成員覆蓋凳鬓,優(yōu)先順序:當前類成員 > trait類成員 > 基類成員
二、使用多個Trait
通過逗號分隔患民,在use聲明列出多個Trait缩举,可以都插入到一個類中。
<?php
trait playBall
{
public function football(){}
}
trait playTools
{
public function piano(){}
}
class sport extends ball
{
use playBall, playTools;
}
三匹颤、沖突的解決
如果兩個trait都插入了一個同名的方法仅孩,如果沒有明確解決沖突將會產(chǎn)生一個致命錯誤。
為了解決多個 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的用法:
- 命名空間
- 匿名函數(shù)
- Trait引用