PHP trait 特性
trait是PHP自5.4版本之后加入的一種新的代碼復用機制,是一種細粒度代碼復用的方法。官方文檔對于trait給出的解釋是:
自 PHP 5.4.0 起,PHP 實現了一種代碼復用的方法,稱為 trait。
Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method。Trait 和 Class 組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題。
Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法通過 trait 自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。
trait 單詞的釋義為特性,很好的解釋了trait這種方法的特點,可以在不同層次結構內獨立的類中復用方法和屬性,以一種易于理解的方式來舉例,在網絡游戲《魔獸世界》當中,法師,潛行者,戰士是三個玩家可以操控的職業,三個職業是平等的,可以理解為繼承自“角色”這一父類, 因為不管玩家使用什么職業,都能夠使用坐騎,所以,父類“Character”中便可以添加一個ride()方法,表示使用坐騎,這樣所有繼承自“Character”的職業便都有了使用坐騎的能力。而不同的職業又有各自的特點,比如說,法師能夠使用暴風雪,潛行者能夠潛行,戰士能夠沖鋒,因此,“mage”類中可以增加“blizzard”方法表示法師使用暴風雪技能,“rogue”類中加入“stealth”方法表示潛行者使用潛行技能,“worrior”類中可以增加“charge”方法表示戰士使用沖鋒技能,這樣各職業的特點便能體現出來。而當分配裝備時,問題就來了,眾所周知《魔獸世界》的裝備系統十分龐大,護甲分為布甲、皮甲、鎖甲、板甲四種不同的種類,而不同的職業能夠裝備的護甲類型不完全相同,有些職業只可以裝備一種類型的護甲,而有的職業可以裝備大部分類型的護甲,這種時候,為了避免重復定義,trait就能夠派上用場了。我們在這里定義“布甲”(cloth armour)、“皮甲”(leather armour)、“板甲”(plate armour)三個不同的trait,表示一個職業可以裝備某一種護甲,這樣我們定義一個職業的時候,便可以通過插入trait來定義這個職業能夠裝備的護甲類型,而這樣一個特性又是獨立于職業之外的,多個職業可以共同享有一個特性,比如,戰士既可以裝備板甲,也可以裝備布甲,這樣在聲明戰士這個類的時候,便可以插入多條特性,來表示戰士是具有作為一個全需黨的條件的:
1 trait ClothArmour 2 { 3 public function putOnClothArmour() 4 { 5 //穿上一件布甲 6 } 7 } 8 trait LeatherArmour 9 { 10 public function putOnLeatherArmour() 11 { 12 //穿上一件皮甲 13 } 14 } 15 trait PlateArmour 16 { 17 public function putOnPlateArmour() 18 { 19 //穿上一件板甲 20 } 21 } 22 class Character 23 { 24 public function ride(){ 25 //召喚坐騎 26 } 27 } 28 //法師 29 class Mage extends Character 30 { 31 use ClothArmour; 32 public function blizzard(){ 33 //使用“暴風雪” 34 } 35 } 36 //戰士 37 class Worrior extends Character 38 { 39 use ClothArmour,LeatherArmour,PlateArmour; 40 public function charge(){ 41 //使用“沖鋒” 42 } 43 } 44 //潛行者 45 class rogue extends Character 46 { 47 use ClothArmour,LeatherArmour; 48 public function stealth(){ 49 //使用“潛行” 50 } 51 } 52 $worrior = new Worrior(); 53 //繼承自父類的方法,召喚坐騎 54 $worrior->ride(); 55 //自身的方法,使用沖鋒技能 56 $worrior->charge(); 57 //戰士能夠裝備布甲 58 $worrior->putOnClothArmour(); 59 //戰士能夠裝備皮甲 60 $worrior->putOnLeatherArmour(); 61 //戰士能夠裝備板甲 62 $worrior->putOnPlateArmour();在這個事例中,就可以看到trait最基礎的使用方法,trait其實是一組描述了某個特性的一些屬性和方法的集合,能夠很方便地進行組合與應用,耦合性低,易于維護,同時特性的引入也在某些程度上減少了層層繼承之后必須不斷追溯父類尋找某些方法的情況,提高的代碼的可讀性,對于提升開發工作的效率以及開發團隊合作是非常好的。
?
?
?
轉載于:https://www.cnblogs.com/jackiebao/p/6763388.html
總結
以上是生活随笔為你收集整理的PHP trait 特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零基础搭建Tomcat集群(超详细)
- 下一篇: 减半技术实现求a的n次幂