php中的traits有什么用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
簡介
Traits是面向對象編程中使用的一種概念,它表示一組可用于擴展類功能的方法。Traits提供了一組實現行為的方法,并要求來實現一組參數化所提供行為的方法。對于對象間的通信(以及對象之間的共享),特性在面向對象的協議(接口)和mixin之間有所不同。界面可以通過方法簽名來定義一個或多個行為,而特征通過完整的方法定義來定義行為:即,它包括方法的主體。相比之下,mixin包含完整的方法定義,并且還可以通過成員變量攜帶狀態,而特征通常不會。
使用
首先看下官方文檔給出的例子:
<?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ } ?>
從上面的例子可以看出,特性集ezcReflectionReturnInfo
包含了兩個方法:getReturnType
和getReturnDescription
,而下面的兩個子類分別繼承自不同的父類,卻可以通過use ezcReflectionReturnInfo
來復用這兩個方法。簡單方便。
注意事項
如果子類、父類、use的traits中存在重名方法,那么這三個方法的優先級為:子類 > tratis > 父類;
可以同時use多個traits,但不可use重名的traits;
如果use的多個traits中存在方法名沖突,可以使用指定某個方法來自于某個tratis。例如:
<?php 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; } }
方法可以使用as來設置別稱,但只在該類有效。
class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } }
使用as的時候,還可以改變方法的可見性。
class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } }
traits可以嵌套,例如A可以use B。
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World!'; } } trait HelloWorld { use Hello, World; }
traits中可以定義abstract方法,同樣的,use該traits的class,也需要實現這些abstract的方法;
traits中可以定義常規變量、靜態的變量和方法;
關于php中的traits有什么用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。