# IOC控制反轉和容器:
* * * * *
由于筆者之前是從事java方面的后因各種原因轉行了php。 如果用過spring的話,那么在thinkphp5.1之中的設計模式和思想你都應該會有所接觸。
* * * * *
解釋:IOC 容器:最主要是完成了完成對象的創建和依賴的管理注入等等。所謂控制反轉,就是把原先我們代碼里面需要實現的對象創建、依賴的代碼,反轉給容器來幫忙實現。那么必然的我們需要創建一個容器,同時需要一種描述來讓容器知道需要創建的對象與對象的關系。
以下代碼是我對spring的理解而寫出來的,雖然在thinkphp5.1上可能會有細微的不同,但是大致上差不多。
簡單的來說下面有那么一段代碼
```
class{
function user()
{
//實例化一個用戶模型
$userModel =new UserModel();
$userModel ->xxxx();
}
}
use xxx/xxxx/UserModel;
class{
//此處由容器自動實例化,然后使用依賴注入一個用戶模型
function user(UserModel $userModel)
{
$userModel ->xxxx();
}
}
```
# 容器做有什么好處呢?
答案:解耦合低內聚,集中管理資源。
上面這樣說雖然不用你手動去new一個對象出來,但是誰去做這一件事情呢,答案是容器。
如果我們需要構造一個很多個參數的的對象,每次需要傳入一堆參數再去new一下是不是有點麻煩呢?
就像工廠模式這樣,你對工廠說,我要一個用戶,他就自動裝配和生成一個用戶給你,你不用去了解其生產細節只需要你會去使用就好。
如果你大量代碼都需要new去實例化,這樣既可以節省代碼量,也可以更輕松的修改和維護。
# 實例
## 代碼

```
<?php
namespace app\index\controller;
class Ioc
{
//手動實例化
function index()
{
$test = new Test();
return $test->echoTest();
}
//使用依賴注入,注入之前自動實例化,默認調用無參的方法
function index2(Test $test)
{
return $test->echoTest();
}
//使用容器自動生成new一個出來Test類的實例化出來
function index3()
{
$test = app('app\index\controller\Test');
return $test->echoTest();
}
}
```
我們可以看到當前是index模塊下的Ioc控制器下面有3個方法
1. index方法
我們可以看到我需要調用另外一個類,這個類是什么都行,這邊只是我繼承了控制器而已,與繼承什么無關。然后我手動去實例化這個Test類,獲得其對象然后再用他的方法,最后返回輸出。
2. index2方法
使用依賴注入,注入之前自動實例化。下面引用官方的一些話:
依賴注入其實本質上是指對類的依賴通過構造器完成自動注入,例如在控制器架構方法和操作方法中一旦對參數進行對象類型約束則會自動觸發依賴注入,由于訪問控制器的參數都來自于URL請求,普通變量就是通過參數綁定自動獲取,對象變量則是通過依賴注入生成。
3. index3方法
使用助手app(),該方法會使用單例模式實例化。并且放到容器里面再去返回該實例