自PHP5.4.0起,PHP實作了一種程式碼重複使用的方法,稱為trait
。
眾所周知,PHP中是單繼承的,trait是為類似PHP的單繼承語言而準備得一種程式碼重複使用機制。 trait為了減少單一繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中重複使用method。 trait和class組合的語意定義了一種減少複雜性的方式,避免傳統多繼承問題。
trait
和class
相似,但只是用細粒度和一致的方式來組合功能。無法透過trait本身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個class之間不需要繼承。
推薦PHP影片教學:https://www.php.cn/course/list/29/type/2.html
1、簡單的例子
首先我們舉個例子來介紹trait,和類別定義相似,但使用關鍵字trait定義。在類別中使用use組合。
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } class Demo{ use T; public function test(){ return 'test'; }多个 } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test();
輸出結果:
t1
test
2、多個trait衝突解決
如果使用多個trait,但是出現了方法名稱相同,這就出現了衝突,就要手動指定使用哪個trait的方法,使用
insteadof關鍵字實現。
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } trait T2{ public function t1(){ return 't3'; } } class Demo{ use T,T2{ //使用T的m1方法 T::t1 insteadof T2; } public function test(){ return 'test'; } } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test();
輸出結果:t1
#在衝突的時候,也可以使用use定義方法別名來解決衝突,範例如下:
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } trait T2{ public function t1(){ return 't3'; } } class Demo{ use T,T2{ //使用T的m1方法 T::t1 insteadof T2; T2::t1 as new_t1; } public function test(){ return 'test'; } } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->new_t1(),'</br>'; echo $demo->test();
t3
#test
############################ #####也可以使用###use###關鍵字來改變方法的存取權。 ###<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } class Demo{ use T{ t2 as protected; } public function test(){ return 'test'; } } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->t2(),'</br>'; echo $demo->test();
以上是深入解析PHP trait的詳細內容。更多資訊請關注PHP中文網其他相關文章!