提到php 的程式碼重複使用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類別過多,那麼會產生一系列的問題,例如依賴父類別、耦合性太大、破壞了類別的封裝性。那麼有沒有更好的方法來實現程式碼復用呢?
自 PHP 5.4.0 起,PHP 實作了另一個程式碼重複使用的一個方法,稱為 traits。
Traits 是一種為類似 PHP 的單繼承語言而準備的程式碼重複使用機制。 Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中復用方法集。 Traits 和類別組合的語義是定義了一種方式來減少複雜性,避免與傳統多繼承和混入類別(Mixin)相關的典型問題。
Traits 的使用非常簡單,只需要在類別中使用 use 關鍵字。
trait A { public function test() { echo 'trait A::test()'; } }class b { use A; }$b=new b();$b->test();
簡單來說 Trait 優先權大於父類別方法,但是小於目前類別方法。
trait A { public function test() { echo 'trait A::test()'; } public function test1() { echo 'trait A::test1()'; } }class base{ public function test(){ echo 'base::test()'; } public function test1(){ echo 'base::test1()'; } }class b extends base{ use A; public function test(){ echo 'b::test()'; } }$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()
在使用多個 Trait 時,如果其中存在相同的方法名稱,那麼就會產生衝突。使用 insteadof 和 as 可以解決方法名稱衝突問題
insteadof可以宣告使用兩個相同方法名稱中的具體某個方法。
trait A { public function test() { echo 'trait A::test()'; } }trait B { public function test() { echo 'trait B::test()'; } }class c{ use A,B{ A::test insteadof B;//使用 insteadof 明确使用哪个方法 B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用 } }$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()
使用as 關鍵字我們可以對trait 方法的存取權限進行修改
trait A { public function test() { echo 'trait A::test()'; } private function test1(){ echo 'trait A::test1()'; } }class b{ use A{ test as protected; test1 as public test2;//更改权限时还可以修改名称 } }$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()
trait A { public function test1() { echo 'test1'; } } trait B { public function test2() { echo 'test2'; } } trait C { use A,B; } class D { use C; } $d = new D(); $d->test2(); //test2
Trait可定義屬性,但類別中不能定義同樣名稱屬性
trait A { public $test1; } class B { use A; public $test; public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B... }
Trait支援抽象方法、支援靜態方法、不可以直接定義靜態變量,但靜態變數可被trait方法引用。
trait A { public function test1() { static $a = 0; $a++; echo $a; } abstract public function test2(); //可定义抽象方法 } class B { use A; public function test2() { } } $b = new B(); $b->test1(); //1 $b->test1(); //2
這種 trait use 的使用方法大概和 javascript 中的 call 有點相似,都是把一個另一個物件掛載到目前物件的執行環境當中。當然 javascript 是基於原型的語言。兩者也沒有可比性。僅僅是使用方法相差無幾,有助於理解。
function a() { this.name="a"; this.getName=function(){ console.log(this.name); } }function b(){ this.name="b"; a.call(this); }var b = new b(); b.getName();//a
以上是php中關於traits復用機制的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!