依赖注入模式中,为什么用对象而不是用数组传递?
依賴注入(Dependence Injection, DI) 依賴注入是控制反轉(zhuǎn)的一種設計模式。依賴注入的核心是把類所依賴的單元的實例化過程,放到類的外面去實現(xiàn)。依賴注入的實現(xiàn)離不開反射。
依賴注入(Dependence Injection, DI)
所謂的依賴注入,指將依賴的對象通過參數(shù)的形式一次性傳入,使用時不需要顯式 new 了,比如把A類所依賴的B類、C類等以屬性或者構(gòu)造函數(shù)等方式注入A類而不是直接在A類中實例化。
只要不是由內(nèi)部生產(chǎn)(比如初始化、構(gòu)造函數(shù)中通過工廠方法、自行手動 new 的),而是由外部以參數(shù)或其他形式注入的,都屬于依賴注入(DI) 。
依賴注入需要利用反射實現(xiàn),比如:
class A {protected $b;public function __constrcut(B $b){$this->b = $b;} }// 通過控制反轉(zhuǎn)容器生成 A 的實例時,會通過反射發(fā)現(xiàn) A 的構(gòu)造函數(shù)需要一個 B 類的實例 // 于是自動向 A 類的構(gòu)造函數(shù)注入 B 類的實例 $a = IoC::make(A::class);依賴注入的實質(zhì)就是把一個類不可更換的部分和可更換的部分 分離開來,通過注入的方式來使用,從而達到解耦的目的。
比如有一個 Mysql 數(shù)據(jù)庫連接類如下:
可更換部分是數(shù)據(jù)庫的配置
class Configuration {private $host;private $port;private $username;private $password;private $db_name;public function __construct($host, $port, $username, $password, $db_name){$this->host = $host;$this->port = $port;$this->username = $username;$this->password = $password;$this->db_name = $db_name;}public function getHost(){return $this->host;}public function getPort(){return $this->port;}public function getUsername(){return $this->username;}public function getPassword(){return $this->password;}public function getDbName(){return $this->db_name;} }不可更換部分是Mysql數(shù)據(jù)庫的連接操作
class Mysql {private $configuration;public function __construct(Configuration $config){$this->configuration = $config;}public function connect(){return mysqli_connect($this->configuration->getHost(),$this->configuration->getUsername() ,$this->configuration->getPassword,$this->configuration->getDbName(),$this->configuration->getPort());} }這樣就完成了配置文件和連接邏輯的分離,使用如下:
$config = new Configuration('127.0.0.1', 'root', '', 'my_db', 22); $db = new Mysql($config); $con = $db->connect();$config是注入Mysql的,這就是所謂的依賴注入。
總結(jié)
注入可以理解成從外面把東西打進去。因此,依賴注入模式中,要分清內(nèi)和外,要解除依賴的類內(nèi)部就是內(nèi),實例化所依賴單元的地方就是外。在外通過構(gòu)造形參,為類內(nèi)部的抽象單元提供實例化,達到解耦的目的,使下層依賴于上層,而不是上層依賴于下層。
因此,依賴注入模式中,要用對象傳遞,通過一個實例的反射來實現(xiàn),這是數(shù)組做不到的。
轉(zhuǎn)載于:https://www.cnblogs.com/sunshineliulu/p/10747756.html
總結(jié)
以上是生活随笔為你收集整理的依赖注入模式中,为什么用对象而不是用数组传递?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基本的广告法违禁词、违规词以及敏感词大全
- 下一篇: java 去除敏感词