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
來重複使用這兩個方法。簡單方便。
相關學習推薦:PHP程式設計從入門到精通
注意事項
如果子類別、父類別、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的作用有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!