自 PHP 5.4.0 起,PHP 實作了一種程式碼重複使用的方法,稱為 Trait。
Traits 是一種為類似 PHP 的單繼承語言而準備的程式碼重複使用機制。 Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中重複使用方法集。 Traits 和類別組合的語意是定義了一種方式來減少複雜性,避免與傳統多繼承和混入類別(Mixin)相關的典型問題。
簡單使用
<?phptrait Test { public function echoHello() { echo 'Hello Trait'; } }class Base{ public function index() { echo 'index'; } }class One extends Base{ use Test; }class Two extends Base{ use Test; } $one = new One(); $two = new Two();echo $one->echoHello();echo $one->index();echo $two->echoHello();
結果輸出 Hello Trait index Hello Trait。
從基底類別繼承的成員會被 Trait 插入的成員所覆寫。優先順序是來自目前類別的成員覆寫了 Trait 的方法,而 Trait 則覆寫了被繼承的方法。
<?php trait Test{ public function echoHello() { echo 'Hello Trait'; }}class Base { use Test; public function echoHello() { echo 'Hello Base'; }}class One extends Base { use Test; public function echoHello() { echo 'Hello One'; }}class Two extends Base { use Test;}$one = new One();$two = new Two();$base = new Base(); echo $one->echoHello();echo $two->echoHello();echo $base->echoHello(); 结果输出 Hello One Hello Trait Hello Base。 ?>
class one 範例覆寫基底類別和 Trait Test,說明目前類別的方法優先權高於他們。
class Two 範例覆寫基底類別,Trait 的有優先權高於繼承的基底類別。
class Base 範例覆寫 Trait Test,說明目前類別的方法優先權高於 Trait。
透過逗號分隔,在 use 宣告列出多個 trait,可以都插入到一個類別中。
<?phptrait Test { public function echoHello() { echo 'Hello '; } }trait TestTwo { public function echoWord() { echo 'word !'; } }class One{ use Test,TestTwo; } $one = new One();echo $one->echoHello();echo $one->echoWord();
結果輸出 Hello word !。
如果兩個 Trait 都插入了一個同名的方法,如果沒有明確解決衝突將會產生一個致命錯誤。
<?phptrait Test { public function echoHello() { echo 'Hello Test'; } public function echoWord() { echo 'word Test'; } }trait TestTwo { public function echoHello() { echo 'Hello TestTwo '; } public function echoWord() { echo 'word TestTwo'; } }class One{ use Test, TestTwo { Test::echoHello as echoTest; Test::echoWord insteadof TestTwo; TestTwo::echoHello insteadof Test; } } $one = new One();echo $one->echoTest();echo $one->echoWord();echo $one->echoHello();
輸出結果:Hello Test word Test Hello TestTwo。
使用 as 作為別名,即 Test::echoHello as echoTest; 輸出 Trait Test 中的 echoHello.
#使用 insteadof 操作子用來排除其他其他 TestTwoord,三; 輸出的是 word Test,使用 Trait Test 中的 echoWord
#修改方法的控制權限
<?phptrait Test { public function echoHello() { echo 'Hello'; } public function echoWord() { echo 'word'; } }trait TestTwo { public function echoHello() { echo 'Hello TestTwo '; } public function echoWord() { echo 'word TestTwo'; } }class One{ use Test { echoHello as private; } }class Two{ use Test { echoHello as private echoTwo; } } $one = new One(); $two = new Two();echo $two->echoHello();
輸出結果 Hello。
class one 中使用 as 將 echoHello 設為私有,則透過 class one 無法存取 echoHello。
class two 中使用 as 先重新命名,然後將新命名方法設為私有,原 Trait 中的方法可以正常存取。
Trait 中也可以像類別一樣定義屬性。就是很好用的啦!
上面就是些 Trait 比較基本的使用了,更詳細的可以參考官方手冊。這裡總結下注意的幾 點:Trait 會覆寫呼叫類別繼承的父類別方法,Trait 無法如Class 一樣使用new 實例化
單一Trait 可由多個Trait 組成,在單一Class 中,可以使用多個Trait,Trait 支援修飾字(modifiers),例如final、static、abstract,我們能使用insteadof 以及as 操作子來解決Trait 之間的衝突。
相關推薦:
以上是PHP 程式碼的複用簡單教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!