容器:可以理解為用來存放某個東西的物品(籃子?),存放的東西取決於你想往裡面放點什麼。在這裡,我們是存放某個類,類的描述或者乙個返回類例項的閉包函式。
ioc(inversion of control) 控制反**可以理解為,你(使用者),小紅(容器)。你現在需要一把錘子,但你不想自己去造乙個錘子去。你可以交給小紅去處理。比如對小紅說我想要一把錘子。小紅會通過你給的工具名(錘子),通過自己的方法。去得到錘子的原材料(類的構造),接著在小紅這裡,直接造出來了一把錘子,不需要你來動手。你不需要知道這個錘子(類)所需的原材料(這裡是指類的構造引數)。你通過小紅(容器)而獲取到了這個工具(類的例項).
di(dependency injection) 依賴注入:這和ioc是同一種東西,但不同的是角度。例如:工具(錘子)依賴於小紅(容器)去獲取工具的原材料,並建立出工具(錘子).
減少系統之間的耦合性
增加**穩定和健壯性
也可以理解為工廠模式的一種公升級
class demo1
public function name()
}class demo2
}//正常情況下,我們是需要先例項demo1然後在demo1的建構函式內傳入demo2的
//例項,這樣的耦合度太高,不宜於第二次擴充套件
//一般情況下的手法
//直接在new demo1時就把demo2給new出來並傳入進去
$demo = new demo1(new demo2());
echo $demo->name(); //輸出名字是***
//通過ioc容器實現
class container
//禁止複製當前類
private function __clone(){}
//獲取當前類的例項
public static function _ins()
//如果儲存則直接返回
return self::$instance;
}//成員變數register儲存類的例項或類的描述
private $register = ;
//通過魔術方法__set和__get實現
//設定未定義的成員變數時,會經過__set
public function __set($key,$cvalue)
$this->register[$key] = $cvalue;
}//訪問未定義的成員變數
public function __get($key)
//自動繫結,自動解析
public function build($classname)
//通過反射獲取到類的內部結構
$reflector = new reflectionclass($classname);
//判斷類能不能例項化,排除掉抽象類和介面
if(!$reflector->isinstantiable())
//獲取到類的構造函式引數
$constructor = $reflector->getconstructor();
//判斷構造引數是否沒有定義,如果沒有,則直接返回類例項
if(empty($constructor))
//獲取到建構函式內的引數
$params = $constructor->getparameters();
//遞迴的去呼叫方法解析並構造引數
$dependencies = $this->getdependencies($params);
//建立類的例項
return $reflector->newinstanceargs($dependencies);
}//解析引數
public function getdependencies($parameters)
else
}return $dependencies;
}public function resolvenonclass($parameter)
//沒有預設值就發出警告
throw new exception('引數沒又預設值');
}}//通過ioc容器獲取的
//例項化容器
//直接依賴注入
//輸出名字是***
echo $demo1->name();
依賴注入和容器
下面列子gundong方法和kaochuan方法緊密結合,偶合度高,不利於擴充套件和維護。程式設計需要降低偶合度,增加可擴充套件性。class luntai class baoma baoma new baoma baoma kaochuan 使用依賴注入優化後的寫法 class luntai cl...
thinkphp(trait 依賴注入 容器)
1 trait 優先順序 子類 trait 父類 3 容器與依賴注入原理 class demo1 temp setname hhh return temp getname 繫結乙個類到容器 進去是類,出來是物件 public function bindclass 繫結乙個閉包到容器 閉包現在請理解為...
依賴注入容器Autofac
在.net上現在存在許多的依賴注入容器,我也在實踐中使用過castle windsor structuremap autofac unity。這些容器的簡要介紹可以參看 ioc in net part 1 autofac ioc in net part2 structuremap ioc in ne...