traits:
它使得類裏面的代碼(主要指屬性和方法)更加靈活的被複用
traits 和 include的有點相似
- 通過include技術我們可以引入文件
- 通過traits技術我們可以引入代碼
實際使用:
在很多個類中如果有一些方法複用時,我們能做的只能是把這些重複的方法放在他們共同的父類中,但是這些類已經有父類了怎麼辦?
沒有辦法使一個類同時繼承多個類,這樣我們對於這些需要重複使用的方法就沒辦法自由的編寫了,如果給他們不同的父類加上這些
方法,就會有很多重複的代碼,不利於後期維護!
1)用traits技術解決這個問題
trait trait名稱{
需要重複使用的方法可以放在這裏,和類裏面編寫的方法一樣;
}
注:trait名稱最好以 t 開頭
trait tKnife{
public function pencil($pencil){
echo $pencil.'ok!';
}
}
2)trait使用方法
在類的內部使用:
use trait 名稱
即可使用被use的trait裏面的各種方法,類似於include
3)優先級
從基本類繼承的成員被trait插入的成員所覆蓋,優先順序是來自當前類的成員覆蓋了trait的方法,而trait則覆蓋了被繼承的方法
4)通過逗號分隔,在use聲明列出多個trait,可以插入到一個類中
use trait 名稱1,trait 名稱2;
5)衝突的解決
如果兩個trait都插入了一個同名的算法,如果沒有明確衝突將會產生一個致命錯誤
1.爲解決多個trait在同一個類中的命名衝突,需要使用insteadof操作符來明確指定使用衝突方法中的哪一個
trait A{
public function smallTalk(){
echo 'a';
}
public function bigtalk(){
echo 'A';
}
}
trait B{
public function smallTalk(){
echo 'b';
}
public function bigTalk(){
echo 'B';
}
}
class Talker{
use A,B{
B::smallTalk insteadof A;
A::bigtalk insteadof B;
}
}
2.
class Aliased_Talker{
use A,B{
B::smallTalk insteadof A;
A::bigtalk insteadof B;
B::bigTalk as talk;
}
}
//注:在使用as前必須解決掉衝突問題