php中的Trait特性技術詳解
阿新 • • 發佈:2018-12-02
/**
* trait 程式碼複用機制
* 1.trait本意是特徵,就是給當前類新增一些新特徵;
* 2.而這些新功能,尚不具備形成一個功能完善的類,並且也不方便用一個類進行包裝
* 3.類似於類的外掛庫,用來擴充當前類的功能,或者在不修改父類功能的前提下,實現功能動態更新
* 4.它工作在當前類與父類之間(如果有),可覆寫同名父類成員
* 5.trai類之間可以相互組合,也可進行訪問控制
* 6.trait類中也可以有屬性(7.0前類中不允許有與之同名屬性,7.0後可以,但必須同性同值)
* 所謂同性同值: 訪問限制相同,初始值相同
* 7.trait類儘管也使用與類一樣的語法,但卻不是類,所以不能例項化
* 8.trait類是使用use關鍵字將自身程式碼插入到當前工作類中的
* 9.trait類中的同名成員衝突可以使用替換(insteadof)和別名(as)來解決
*/
//優先順序
//Bus > trait > Auto
trait Func1 { //保養 public function care() { return '我是Func1中的保養方法'; } //駕駛 public function drive() { return '支援無人駕駛'; } //交能事故處理 public function accident() //['æksədənt] { return '汽車會自動報警,你就安靜的坐在車裡等警察來吧!'; } } trait Func2 { //燃料能源 public function fuel() { return '新能源汽車'; } //交能事故處理 public function accident() { return '只要不起火,電池還能繼續使用的,放心吧!'; } } class Auto { public $brand; public $purpose; public function __construct($brand,$purpose) { $this->brand = $brand ; $this->purpose = $purpose ; } //保養 public function care() { return '請到授權的專業4s店進行保養'; } } class Bus extends Auto { //匯入trait類庫: Func1, Func2,並宣告命名衝突解決方案 // use Func1; // use Func2; use Func1,Func2 { //當直接訪問accident()時,用Func1中的同名方法替換Func2同名方法 Func1::accident insteadof Func2 ; //為防止Func2中的accident()方法無法呼叫,可以使用別名,來解決衝突 Func2::accident as Aaccident; } //保養 public function care() { return '我是Bus中的保養方法'; } } $bus = new Bus('賓士','私家車'); echo $bus->brand.'<br>'; echo $bus->purpose.'<br>'; echo $bus->drive().'<br>'; echo $bus->care().'<br>'; echo '<hr>'; echo $bus->accident().'<br>'; //使用別名訪問 Func2中的 accident()方法: 別名是: Aaccident echo $bus->Aaccident().'<br>';