摘要:看源代碼了解的基本功能管理對(duì)象實(shí)例化到配置的過程對(duì)象本身不知道自己是由管理的,對(duì)一無所知。對(duì)象使用來管理依賴關(guān)系非常好,但不是必須的。
看 Laravel 源代碼了解 Container
Dependency Injection Containers 的基本功能:
Container 管理對(duì)象實(shí)例化到配置的過程
對(duì)象本身不知道自己是由 Container 管理的,對(duì) Container 一無所知。
這就是為什么 Container 能夠管理任何 PHP 對(duì)象。 對(duì)象使用 DI 來管理依賴關(guān)系非常好,但不是必須的。
ilogger = $logger; } public function show() { $user = "小灰灰"; $this->logger->execute($user); } } $useLogger = new UseLogger(new LogToFile()); $useLogger->show();ii A
logger = $logger; } public function show() { $user = "小灰灰"; $this->logger->execute($user); } } $useLogger = new UseLogger(new LogToFile()); $useLogger->show();B
logger = $logger; } public function show() { $user = "小灰灰"; $this->logger->execute($user); } } $useLogger = new UseLogger(new LogToDD()); $useLogger->show();iii
logger = $logger; } public function show() { $user = "小灰灰"; $this->logger->execute($user); } } $useLogger = new UseLogger(new LogToFile()); $useLogger->show(); echo "終極版
"; $useLogger = new UseLogger(new LogToDD()); $useLogger->show();
logger = $logger; } public function show() { $user = "小灰灰"; $this->logger->execute($user); } } class SimpleContainer { // 用于存儲(chǔ)所有綁定 key-value protected static $container = []; public static function bind($name, Callable $resolver) { static::$container[$name] = $resolver; } public static function make($name) { if(isset(static::$container[$name])){ $resolver = static::$container[$name] ; return $resolver(); } throw new Exception("Binding does not exist in container"); } } SimpleContainer::bind(Logger::class, function () { return new LogToDD(); }); $useLogger3 = new UseLogger(SimpleContainer::make(Logger::class)); $useLogger3->show();示例
module = $module; } public function show(array $target){ $this->module->activate($target); } } class PowerA implements SuperModuleInterface { public function activate(array $target) { echo "". __METHOD__; print_r(func_get_args()); } } class PowerB implements SuperModuleInterface { public function activate(array $target) { echo "". __METHOD__; print_r(func_get_args()); } } class Container { protected $binds; protected $instances; /** * @param $abstract * @param $concrete * 把代詞 綁定到容器里,為后續(xù)make */ public function bind($abstract, $concrete) { if ($concrete instanceof Closure) { $this->binds[$abstract] = $concrete; } else { $this->instances[$abstract] = $concrete; } } /** * @param $abstract * @param array $parameters * @return mixed * 創(chuàng)建對(duì)象 */ public function make($abstract, $parameters = []) { if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } // 把容器對(duì)象$this,放到參數(shù)數(shù)組第一個(gè)元素。為call_user_func_array使用 array_unshift($parameters, $this); // 這里$this->binds[$abstract] 綁定的閉包函數(shù), 執(zhí)行函數(shù)參數(shù)是$parameters return call_user_func_array($this->binds[$abstract], $parameters); } } // 創(chuàng)建一個(gè)容器(后面稱作超級(jí)工廠) $container = new Container; // 向該 超級(jí)工廠添加超能力模組的生產(chǎn)腳本 $container->bind("powerA", function($container) { return new PowerA; }); // 同上 $container->bind("powerB", function($container) { return new PowerB; }); // 向該 超級(jí)工廠添加超人的生產(chǎn)腳本 $container->bind("superman", function($container, $moduleName) { return new Superman($container->make($moduleName)); }); echo ""; // 開始啟動(dòng)生產(chǎn) $superman_1 = $container->make("superman", ["powerA"]); $superman_1->show(["a" => 1]); $superman_2 = $container->make("superman", ["powerB"]); $superman_2->show(["b" => 1]);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31720.html
摘要:反射簡(jiǎn)介參考官方簡(jiǎn)介的話,具有完整的反射,添加了對(duì)類接口函數(shù)方法和擴(kuò)展進(jìn)行反向工程的能力。此外,反射提供了方法來取出函數(shù)類和方法中的文檔注釋。 反射簡(jiǎn)介 參考官方簡(jiǎn)介的話,PHP 5 具有完整的反射 API,添加了對(duì)類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來取出函數(shù)、類和方法中的文檔注釋。 YII2框架中示例 對(duì)于yii2框架,應(yīng)該都知道di容器,...
摘要:依賴注入控制反轉(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...
摘要:環(huán)境模型簡(jiǎn)介是一個(gè)開源的應(yīng)用容器引擎讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。 docker php環(huán)境模型 showImg(https://segmentfault.com/img/bVbfiCy?w=1661&h=871); docker 簡(jiǎn)介 Docker 是一個(gè)開源的應(yīng)用容器引擎 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包...
摘要:環(huán)境模型簡(jiǎn)介是一個(gè)開源的應(yīng)用容器引擎讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。 docker php環(huán)境模型 showImg(https://segmentfault.com/img/bVbfiCy?w=1661&h=871); docker 簡(jiǎn)介 Docker 是一個(gè)開源的應(yīng)用容器引擎 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包...
摘要:環(huán)境模型簡(jiǎn)介是一個(gè)開源的應(yīng)用容器引擎讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。 docker php環(huán)境模型 showImg(https://segmentfault.com/img/bVbfiCy?w=1661&h=871); docker 簡(jiǎn)介 Docker 是一個(gè)開源的應(yīng)用容器引擎 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包...
閱讀 3671·2023-04-26 02:07
閱讀 3178·2021-09-22 15:55
閱讀 2548·2021-07-26 23:38
閱讀 3128·2019-08-29 15:16
閱讀 2019·2019-08-29 11:16
閱讀 1760·2019-08-29 11:00
閱讀 3601·2019-08-26 18:36
閱讀 3172·2019-08-26 13:32