摘要:下面的代碼是我實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的容器,很多地方處理并不是很好,但是應(yīng)該已經(jīng)足夠了。這個(gè)變量保存,是名字實(shí)例的映射單例一開始是受到的影響,所以寫了一個(gè)函數(shù),看完的容器實(shí)現(xiàn),印象之中,和來回變換。
之前看了好多框架,laravel,thinkphp,yii等等?;旧隙际褂昧巳萜鳌?duì)于我而言,雖然看懂了laravel是怎么寫的,但是如果自己不去嘗試一下,始終覺得不會(huì)這個(gè)東西。
下面的代碼是我實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的容器,很多地方處理并不是很好,但是應(yīng)該已經(jīng)足夠了。
實(shí)例的映射 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的影響,所以寫了一個(gè)bind函數(shù), * 看完laravel的容器實(shí)現(xiàn),印象之中,$concrete和$abstract來回變換。 * 下面的代碼有點(diǎn)像thinkphp的里面的實(shí)現(xiàn),好理解一點(diǎn) */ 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一個(gè)數(shù)組,laravel好像是make和build分開的。 static::getInstance()->make($name); } } /** * 核心是make方法了 */ public static function get($name){ return static::getInstance()->make($name); } /** * 核心make方法 */ public function make($name){ try{ //根據(jù)類名去查找$this->binds實(shí)例是否已經(jīng)存在,如果存在就直接返回 if(array_key_exists($name,$this->binds)){ return $this->binds[$name]; } //根據(jù)類名得到它的反射類 $reflectClass = new ReflectionClass($name); //利用反射類 $constructor = $reflectClass->getConstructor(); //如果沒有構(gòu)造器的話,就直接去實(shí)例化它 $params = []; if(!is_null($constructor)){ //獲取構(gòu)造器中的方法 $constructorParams = $constructor->getParameters(); // var_dump($constructorParams); //保存構(gòu)造器的參數(shù) foreach($constructorParams as $constructorParam){ //這個(gè)地方主要是判斷參數(shù)是否是類,如果是就遞歸的構(gòu)造它,不是就簡(jiǎn)單的添加到$this->params中 if(!is_null($constructorParam->getType())){ $params[] =$this->make($constructorParam->name,$constructorParam->name); }else{ $params[] = $constructorParam->name; } } } //在這個(gè)地方構(gòu)造實(shí)例 $class = $reflectClass->newInstanceArgs($params); //綁定 $this->binds[$name] = $class; return $class; }catch(ReflectionException $e){ echo $e->getMessage(); } } private function __construct(){} private function __clone(){} } ?>
下面是我的測(cè)試文件了,
name; } public function sayDI2Name(DI2 $di2){ //如果這么寫的,di2方法會(huì)先于前面的字符串打印出來 // 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 " "; ?>
最后的結(jié)果如下
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30963.html
摘要:在中使用解耦,有兩種注入方式構(gòu)造函數(shù)注入屬性注入。對(duì)象的實(shí)例化解析依賴信息該方法實(shí)質(zhì)上就是通過的反射機(jī)制,通過類的構(gòu)造函數(shù)的參數(shù)分析他所依賴的單元。 有關(guān)概念 依賴倒置原則(Dependence Inversion Principle, DIP) 傳統(tǒng)軟件設(shè)計(jì)中,上層代碼依賴于下層代碼,當(dāng)下層出現(xiàn)變動(dòng)時(shí),上層也要相應(yīng)變化。 DIP的核心思想是:上層定義接口,下層實(shí)現(xiàn)這個(gè)接口,從而使的下...
摘要:依賴注入容器管理應(yīng)用程序中的全局對(duì)象包括實(shí)例化處理依賴關(guān)系。為了解決這樣的問題,我們?cè)俅位氐饺肿?cè)表創(chuàng)建組件。參考文章程序員如何理解依賴注入容器補(bǔ)充很多代碼背后,都是某種哲學(xué)思想的體現(xiàn)。 思想 思想是解決問題的根本思想必須轉(zhuǎn)換成習(xí)慣構(gòu)建一套完整的思想體系是開發(fā)能力成熟的標(biāo)志——《簡(jiǎn)單之美》(前言) . 成功的軟件項(xiàng)目就是那些提交產(chǎn)物達(dá)到或超出客戶的預(yù)期的項(xiàng)目,而且開發(fā)過程符合時(shí)間和費(fèi)...
摘要:前言最近在使用框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入控制反轉(zhuǎn),覺得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉(zhuǎn)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。 前言 最近在使用ThinkPHP5框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入(控制反轉(zhuǎn)),覺得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。 簡(jiǎn)介 I...
摘要:依賴注入控制反轉(zhuǎn)的一種具體實(shí)現(xiàn)方法。接下來,我們使用依賴注入實(shí)現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動(dòng)傳入。從單元測(cè)試的角度看,依賴注入更方便和操作,方便了測(cè)試人員寫出質(zhì)量更高的測(cè)試代碼。 前言 好的設(shè)計(jì)會(huì)提高程序的可復(fù)用性和可維護(hù)性,也間接的提高了開發(fā)人員的生產(chǎn)力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:對(duì)象之間耦合度過高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形??刂票环崔D(zhuǎn)之后,獲得依賴對(duì)象的過程由自身管理變?yōu)榱擞扇萜髦鲃?dòng)注入。于是,他給控制反轉(zhuǎn)取了一個(gè)更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個(gè)人微信訂閱號(hào)每天學(xué)編...
閱讀 4220·2023-04-26 02:13
閱讀 2322·2021-11-08 13:13
閱讀 2823·2021-10-11 10:59
閱讀 1804·2021-09-03 00:23
閱讀 1367·2019-08-30 15:53
閱讀 2366·2019-08-28 18:22
閱讀 3108·2019-08-26 10:45
閱讀 800·2019-08-23 17:58