摘要:下面的代碼是我實現的一個簡單的容器,很多地方處理并不是很好,但是應該已經足夠了。這個變量保存,是名字實例的映射單例一開始是受到的影響,所以寫了一個函數,看完的容器實現,印象之中,和來回變換。
之前看了好多框架,laravel,thinkphp,yii等等。基本上都使用了容器。對于我而言,雖然看懂了laravel是怎么寫的,但是如果自己不去嘗試一下,始終覺得不會這個東西。
下面的代碼是我實現的一個簡單的容器,很多地方處理并不是很好,但是應該已經足夠了。
實例的映射 private $binds = []; public static $instance = null; /** * 單例 */ public static function getInstance(){ if(static::$instance == null){ static::$instance = new static(); return static::$instance ; } return static::$instance; } /** * 一開始是受到laravel的影響,所以寫了一個bind函數, * 看完laravel的容器實現,印象之中,$concrete和$abstract來回變換。 * 下面的代碼有點像thinkphp的里面的實現,好理解一點 */ public static function bind($name,$class = null){ if($class instanceof Closure){ static::getInstance()->binds[$name] = $class; }else if(is_object($class)){ static::getInstance()->binds[$name] = $class; }else{ //在這里開始make一個數組,laravel好像是make和build分開的。 static::getInstance()->make($name); } } /** * 核心是make方法了 */ public static function get($name){ return static::getInstance()->make($name); } /** * 核心make方法 */ public function make($name){ try{ //根據類名去查找$this->binds實例是否已經存在,如果存在就直接返回 if(array_key_exists($name,$this->binds)){ return $this->binds[$name]; } //根據類名得到它的反射類 $reflectClass = new ReflectionClass($name); //利用反射類 $constructor = $reflectClass->getConstructor(); //如果沒有構造器的話,就直接去實例化它 $params = []; if(!is_null($constructor)){ //獲取構造器中的方法 $constructorParams = $constructor->getParameters(); // var_dump($constructorParams); //保存構造器的參數 foreach($constructorParams as $constructorParam){ //這個地方主要是判斷參數是否是類,如果是就遞歸的構造它,不是就簡單的添加到$this->params中 if(!is_null($constructorParam->getType())){ $params[] =$this->make($constructorParam->name,$constructorParam->name); }else{ $params[] = $constructorParam->name; } } } //在這個地方構造實例 $class = $reflectClass->newInstanceArgs($params); //綁定 $this->binds[$name] = $class; return $class; }catch(ReflectionException $e){ echo $e->getMessage(); } } private function __construct(){} private function __clone(){} } ?>
下面是我的測試文件了,
name; } public function sayDI2Name(DI2 $di2){ //如果這么寫的,di2方法會先于前面的字符串打印出來 // echo "form Test say di2 name: ".$di2->sayName(); echo "form Test say di2 name: "; echo $di2->sayName(); } } class DI{ private $name = "DI"; public function __construct(DI2 $di2){} public function sayName(){ echo $this->name; } } class DI2{ private $name = "DI2"; public function __construct(){} public function sayName(){ echo $this->name; } } class DI3{ private $name = "DI3"; public function __construct(){} public function sayName(){ echo $this->name; } } class DI4{ private $name = "DI4"; public function __construct(){} public function sayName(){ echo $this->name; } } //要不要無所謂了 // Container::bind("test","Test"); $test = Container::get("test"); $test->sayName(); echo " "; $test->sayDI2Name(new DI2()); echo " "; $di = Container::get("di"); $di->sayName(); echo " "; $di2 = Container::get("di2"); $di2->sayName(); echo " "; $di3 = new DI3(); Container::get("di3",$di3)->sayName(); echo " "; $di4 = function(){ return new DI4(); }; Container::get("di4",$di4)->sayName(); echo " "; ?>
最后的結果如下
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30963.html
摘要:在中使用解耦,有兩種注入方式構造函數注入屬性注入。對象的實例化解析依賴信息該方法實質上就是通過的反射機制,通過類的構造函數的參數分析他所依賴的單元。 有關概念 依賴倒置原則(Dependence Inversion Principle, DIP) 傳統軟件設計中,上層代碼依賴于下層代碼,當下層出現變動時,上層也要相應變化。 DIP的核心思想是:上層定義接口,下層實現這個接口,從而使的下...
摘要:依賴注入容器管理應用程序中的全局對象包括實例化處理依賴關系。為了解決這樣的問題,我們再次回到全局注冊表創建組件。參考文章程序員如何理解依賴注入容器補充很多代碼背后,都是某種哲學思想的體現。 思想 思想是解決問題的根本思想必須轉換成習慣構建一套完整的思想體系是開發能力成熟的標志——《簡單之美》(前言) . 成功的軟件項目就是那些提交產物達到或超出客戶的預期的項目,而且開發過程符合時間和費...
摘要:前言最近在使用框架,看了下他的源碼,發現有很多地方也用到了依賴注入控制反轉,覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。 前言 最近在使用ThinkPHP5框架,看了下他的源碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。 簡介 I...
摘要:依賴注入控制反轉的一種具體實現方法。接下來,我們使用依賴注入實現控制反轉,使依賴關系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質量更高的測試代碼。 前言 好的設計會提高程序的可復用性和可維護性,也間接的提高了開發人員的生產力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:對象之間耦合度過高的系統,必然會出現牽一發而動全身的情形。控制被反轉之后,獲得依賴對象的過程由自身管理變為了由容器主動注入。于是,他給控制反轉取了一個更合適的名字叫做依賴注入。 Spring還可以這么學--IoC(控制反轉) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發是在我的個人微信訂閱號每天學編...
閱讀 4002·2023-04-26 02:13
閱讀 2244·2021-11-08 13:13
閱讀 2729·2021-10-11 10:59
閱讀 1732·2021-09-03 00:23
閱讀 1301·2019-08-30 15:53
閱讀 2275·2019-08-28 18:22
閱讀 3050·2019-08-26 10:45
閱讀 727·2019-08-23 17:58