PHP學習——29 PHP面向物件(trait特性的宣告與使用技巧:實現程式碼複用的類方法集合)
阿新 • • 發佈:2018-11-27
自 PHP 5.4.0 起,PHP 實現了一種程式碼複用的方法,稱為 trait。
Trait 是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中複用 method。Trait 和 Class 組合的語義定義了一種減少複雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題。
Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法通過 trait 自身來例項化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。
<?php // 1.建立一個trait類CodeSet1 trait CodeSet1 { public $name = '我在學PHP';//trait類中可以有屬性,不能有常量 public function hello1() { return 'CodeSet1::hello1()'; } public function do() { return 'CodeSet1::do()'; } } // 2.建立一個trait類CodeSet2 trait CodeSet2 { // 3.1 匯入CodeSet1的程式碼 // use CodeSet1; public function hello2() { return 'CodeSet2::hello2()'; } public function do() { return 'CodeSet2::do()'; } } // 4.建立一個父類類Demo2 class Demo2 { public function hello2() { return '父類Demo2::hello2()'; } } // 3.建立一個類Demo1 class Demo1 extends Demo2 { use CodeSet1,CodeSet2{ CodeSet1::do insteadof CodeSet2; CodeSet2::do as codeSet2Do; } // 3.1 只匯入CodeSet2 // use CodeSet2; // 同一類中,同名方法的訪問優先順序:子類>trait類>父類 public function hello2() { return '子類Demo2::hello2()'; } } $demo1 = new Demo1(); echo $demo1->hello1(); // CodeSet1::hello1() echo '<hr>'; echo $demo1->name; // 我在學PHP echo '<hr>'; // echo $demo1->hello2(); // CodeSet2::hello2() // 5.增加子類方法hello2 echo $demo1->hello2(); // 子類Demo2::hello2() // 總結:同一類中,同名方法的訪問優先順序:子類>trait類>父類 echo '<hr>'; // 6.trait類中的方法重名時使用別名 // CodeSet1和CodeSet2新增方法do,註釋CodeSet2和Demo1中的語句:use CodeSet1; echo $demo1->do();//CodeSet1::do() echo '<hr>'; echo $demo1->codeSet2Do();//codeSet2Do是CodeSet2::do的別名 // CodeSet2::do() ?>