php traits的作用是針對php這樣的單繼承語言設計的,旨在讓開發者很方便的在不同繼承體系的多個類之間公用一系列方法,以減少單繼承帶來的局限性。
Traits
是針對php這樣的單繼承語言設計的。旨在讓開發者很方便的在不同繼承體系的多個類之間公用一系列方法,以減少單繼承帶來的局限性。Traits和class的結合,避免了多繼承帶來的一些列問題。
使用
首先看下官方文件給出的例子:
<?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的作用有哪些?的詳細內容,更多請關注TW511.COM其它相關文章!