<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                https://segmentfault.com/a/1190000007209266 ## 前言 最近在使用`ThinkPHP5`框架,看了下他的源碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。 ## 簡介 ~~~coq IoC - Inversion of Control 控制反轉 DI - Dependency Injection 依賴注入 ~~~ 依賴注入和控制反轉說的實際上是同一個東西,它們是一種設計模式,這種設計模式用來減少程序間的耦合 ## 優勢(為什么使用) 使用依賴注入,最重要的一點好處就是有效的分離了對象和它所需要的外部資源,使得它們松散耦合,有利于功能復用,更重要的是使得程序的整個體系結構變得非常靈活。 ## 概念 依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。 * 依賴注入是從應用程序的角度在描述,可以把依賴注入,即:應用程序依賴容器創建并注入它所需要的外部資源; * 而控制反轉是從容器的角度在描述,即:容器控制應用程序,由容器反向的向應用程序注入應用程序所需要的外部資源。 ## 問答 對于一個菜鳥,如果你看了上面的概念還是一頭霧水的話,那么恭喜你,你和我一樣不是天才,那么下面就讓我們借助于幾個問答來搞清楚這個概念的意思吧。 ### 問題 1. 整個過程中參與者都有誰? 2. 依賴:誰依賴于誰?為什么需要依賴? 3. 注入:誰注入于誰?到底注入了什么? 4. 控制反轉:誰控制誰?控制什么?為何叫反轉(有反轉就應該有正轉了,正轉是什么呢?) 5. 依賴注入和控制反轉是同一概念嗎? ### 回答 1. 整個過程中參與者都有誰? ~~~stata 一般有三方參與者,一個是某個對象;一個是IoC/DI的容器;另一個是某個對象的外部資源。 某個對象指的就是任意的、普通的PHP對象; IoC/DI的容器簡單點說就是指用來實現IoC/DI功能的一個框架程序; 對象的外部資源指的就是對象需要的,但是是從對象外部獲取的,都統稱資源,比如:對象需要的其它對象、或者是對象需要的文件資源等等。 ~~~ 2. 誰依賴于誰: ~~~stata 當然是某個對象依賴于IoC/DI的容器 ~~~ 3. 為什么需要依賴: ~~~stata 對象需要IoC/DI的容器來提供對象需要的外部資源 ~~~ 4. 誰注入于誰: ~~~stata 是IoC/DI的容器 注入 某個對象 ~~~ 5. 到底注入什么: ~~~undefined 就是注入某個對象所需要的外部資源 ~~~ 6. 誰控制誰: ~~~stata 當然是IoC/DI的容器來控制對象了 ~~~ 7. 控制什么: ~~~undefined 主要是控制對象實例的創建 ~~~ 8. 為何叫反轉: ~~~mathematica 反轉是相對于正向而言的,那么什么算是正向的呢? 考慮一下常規情況下的應用程序,如果要在A里面使用C,你會怎么做呢?當然是直接去創建C的對象,也就是說,是在A類中主動去獲取所需要的外部資源C($c = new C();),這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中。 用圖例來說明一下,先看沒有IoC/DI的時候,常規的A類使用C類的示意圖,如下圖所示: ~~~ ![clipboard.png](https://segmentfault.com/img/bVEpvW?w=480&h=94 "clipboard.png") 代碼示意: ~~~php <?php /** * 沒有IoC/DI的時候,常規的A類使用C類的示例 */ /** * Class c */ class c { public function say() { echo 'hello'; } } /** * Class a */ class a { private $c; public function __construct() { $this->c = new C(); // 實例化創建C類 } public function sayC() { echo $this->c->say(); // 調用C類中的方法 } } $a = new a(); $a->sayC(); ~~~ 當有了IoC/DI的容器后,A類不再主動去創建C了,如下圖所示: ![clipboard.png](https://segmentfault.com/img/bVEpxY?w=540&h=94 "clipboard.png") 而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中,如下圖所示: ![clipboard.png](https://segmentfault.com/img/bVEpyH?w=566&h=229 "clipboard.png") 代碼示意: ~~~php <?php /** * 當有了IoC/DI的容器后,a類依賴c實例注入的示例 */ /** * Class c */ class c { public function say() { echo 'hello'; } } /** * Class a */ class a { private $c; public function setC(C $c) { $this->c = $c; // 實例化創建C類 } public function sayC() { echo $this->c->say(); // 調用C類中的方法 } } $c = new C(); $a = new a(); $a->setC($c); $a->sayC(); ~~~ 9.什么是正轉?正轉就是按照普通的我們再類中直接創建對象實例,如 $c = new C(); 10.依賴注入和控制反轉是同一概念嗎? ~~~autohotkey 根據上面的講述,我們不難出來,`依賴注入`和`控制反轉`確實是對同一件事情的不同描述,從某個方面講,就是它們描述的`角度`不同。 ~~~ ## 總結 其實IoC/DI對編程帶來的最大改變不是從代碼上,而是從思想上,發生了“主從換位”的變化。應用程序原本是老大,要獲取什么資源都是主動出擊,但是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC/DI容器來創建并注入它所需要的資源了。 ## 注意 我們上面說了,這是一種“設計模式”,就像“工廠模式”和“單例模式”等是一樣的,它是一種面向對象中的編程“思想”,自然它也不僅限于PHP,而是所有面向對象的語言基本都是可以適用的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看