為了解決PHP單繼承的限制,出現了trait類,trait是類,但是不能實例化
### trait優先級(當前類\>trait類\>父類)
當前類中的方法與trait類,父類中的方法重名時,當前類的級別最高,先訪問當前類的方法,然后trait類的優先級又高于父類,
當多個trait類中有同名方法時:會出錯,要用一條規則來區分:
use Demo1, Demo2 {
Demo1::hello insteadof Demo2;
Demo2::hello as Demo2Hello;
}
上面的代碼就是將Demo1中的hello方法代替Demo2中的hello方法,
Demo2中的hello方法起個別名就可以用了。
### 容器與依賴注入的原理
* 在thinkphp中容器是典型的一個注冊樹模式。
* 任何的URL訪問,最終都是定位到控制器,由控制器中的某個具體方法去執行
* 一個控制器對應著一個類,如果這些類需要進行統一管理,用容器來進行類管理,還可以將類的實例(對象)做為參數,傳遞給類方法,自動觸發依賴注入。
* 依賴注入:將對象類型的數據,以參數的方式傳到方法的參數列表中
* URL訪問:通過GET方式將數據傳到控制器指定的方法中,但是只能傳字符串、數值。
* 如何傳一個對象到當前方法中:用依賴注入;依賴注入是解決了向類中的方法傳對象的問題。
* 將類綁定到容器中
```PHP
public function bindClass(){
\\think\\Container::set('temp','\\app\\common\\Temp');
$temp = \\think\\Container::get('temp',\['name'=>'jeevin.cn'\]);
return $temp->getName();
}
```
* 依賴注入
依賴注入就是將一個類做為參數傳遞給另一個類的方法中,相當于自己實例化了,而依賴的類就可以直接使用注入類中的方法與屬性了。
* 閉包
閉包相當于一個匿名函數,將閉包綁定到容器中:
public function bindClosure(){
\\think\\Container::set('demo',function($domain){
return '這是一個bibao'.$domain;
});
return \\think\\Container::get('demo',\['domain'=>'htpp://www.jeevin.cn'\]);
}
> * Facade(門面類)
系統大部分類都用Fa?ade靜態代理了,可以直接引用,為了更加方便,還為這些類起了個別名,可以直接用別名,更加方便,如:use think\\facade\\Request;相當于\\Request。
給類套用一個馬甲,使類具有靜態功能
普通類的靜態代理:如果想靜態調用一個動態類的方法,需要給當前類定義一個靜態代理,首先要繼承think\\Facade類,然后再調用protected static function getFacadeClass(){}就可以靜態代理一個普通類了。
app\\facade\\Test代理了app\\common\\Test
如果不用靜態getFacadeClass獲取,就需要動態綁定
動態綁定用think\\Facade::bind('app\\facade\\Test','app\\common\\Test');
說白了,靜態代理就是將一個普通的類不需要實例化,直接用靜態方法去調用里面的動態方法。
只需引入think\\Facade;
然后再:
protected static function getFacadeClass()
{
return '你要代理的類';//需要帶上命名空間
}
> 注:在tp5中,控制器中可以不繼承父類控制器(Controller),但還是建議繼承,在Controller.php是沒有靜態代理的。