php依賴注入與容器,Container,控制反轉

2021-10-04 22:16:07 字數 2133 閱讀 8690

容器:可以理解為用來存放某個東西的物品(籃子?),存放的東西取決於你想往裡面放點什麼。在這裡,我們是存放某個類,類的描述或者乙個返回類例項的閉包函式。

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...