茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    理解php依賴注入和控制反轉(zhuǎn)
    來源:易賢網(wǎng) 閱讀:1343 次 日期:2016-08-23 16:26:08
    溫馨提示:易賢網(wǎng)小編為您整理了“理解php依賴注入和控制反轉(zhuǎn)”,方便廣大網(wǎng)友查閱!

    要想理解php依賴注入和控制反轉(zhuǎn)兩個概念,就必須搞清楚如下的問題:

    DI——Dependency Injection   依賴注入

    IoC——Inversion of Control  控制反轉(zhuǎn)

    1、參與者都有誰?  

    答:一般有三方參與者,一個是某個對象;一個是IoC/DI的容器;另一個是某個對象的外部資源。又要名詞解釋一下,某個對象指的就是任意的、普通的Java對象; IoC/DI的容器簡單點說就是指用來實現(xiàn)IoC/DI功能的一個框架程序;對象的外部資源指的就是對象需要的,但是是從對象外部獲取的,都統(tǒng)稱資源,比如:對象需要的其它對象、或者是對象需要的文件資源等等。

    2、依賴:誰依賴于誰?為什么會有依賴?

    答:某個對象依賴于IoC/DI的容器。依賴是不可避免的,在一個項目中,各個類之間有各種各樣的關(guān)系,不可能全部完全獨立,這就形成了依賴。傳統(tǒng)的開發(fā)是使用其他類時直接調(diào)用,這會形成強耦合,這是要避免的。依賴注入借用容器轉(zhuǎn)移了被依賴對象實現(xiàn)解耦。

    3、注入:誰注入于誰?到底注入什么?

    答:通過容器向?qū)ο笞⑷肫渌枰耐獠抠Y源

    4、控制反轉(zhuǎn):誰控制誰?控制什么?為什么叫反轉(zhuǎn)?

    答:IoC/DI的容器控制對象,主要是控制對象實例的創(chuàng)建。反轉(zhuǎn)是相對于正向而言的,那么什么算是正向的呢?考慮一下常規(guī)情況下的應用程序,如果要在A里面使用C,你會怎么做呢?當然是直接去創(chuàng)建C的對象,也就是說,是在A類中主動去獲取所需要的外部資源C,這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中。

    5、依賴注入和控制反轉(zhuǎn)是同一概念嗎?

    答:從上面可以看出:依賴注入是從應用程序的角度在描述,可以把依賴注入描述完整點:應用程序依賴容器創(chuàng)建并注入它所需要的外部資源;而控制反轉(zhuǎn)是從容器的角度在描述,描述完整點:容器控制應用程序,由容器反向的向應用程序注入應用程序所需要的外部資源。 

    下面我們通過例子來具體看看依賴注入的一些實現(xiàn)方式:

    1.構(gòu)造器注入

    <?php

    class Book {

      private $db_conn;

      public function __construct($db_conn) {

        $this->db_conn = $db_conn;

      }

    }

    2、setter注入

    <?php

    class book{

       private $db;

       private $file;

       function setdb($db){

         $this->db=$db;

       }

       function setfile($file){

         $this->file=$file;

       }

    }

    class file{}

    class db{}

    ...

    class test{

       $book = new Book();

        $book->setdb(new db()); 

       $book->setfile(new file());

    }

    ?>

    上面?zhèn)z種方法代碼很清晰,但是當我們需要注入很多個依賴時,意味著又要增加很多行,會比較難以管理。

    比較好的解決辦法是 建立一個class作為所有依賴關(guān)系的container,在這個class中可以存放、創(chuàng)建、獲取、查找需要的依賴關(guān)系

    <?php

    class Ioc {

      protected $db_conn;

      public static function make_book() {

        $new_book = new Book();

        $new_book->set_db(self::$db_conn);

        //...

        //...

        //其他的依賴注入

        return $new_book;

      }

    }

    此時,如果獲取一個book實例,只需要執(zhí)行$newone = Ioc::makebook();

    以上是container的一個具體實例,最好還是不要把具體的某個依賴注入寫成方法,采用registry注冊,get獲取比較好

    <?php

    class Ioc {

    /**

    * @var 注冊的依賴數(shù)組

    */

      protected static $registry = array();

      /**

      * 添加一個resolve到registry數(shù)組中

      * @param string $name 依賴標識

      * @param object $resolve 一個匿名函數(shù)用來創(chuàng)建實例

      * @return void

      */

      public static function register($name, Closure $resolve)

      {

       static::$registry[$name] = $resolve;

      }

      /**

       * 返回一個實例

       * @param string $name 依賴的標識

       * @return mixed

       */

      public static function resolve($name)

      {

        if ( static::registered($name) )

        {

         $name = static::$registry[$name];

         return $name();

        }

        throw new Exception('Nothing registered with that name, fool.');

      }

      /**

      * 查詢某個依賴實例是否存在

      * @param string $name id

      * @return bool 

      */

      public static function registered($name)

      {

       return array_key_exists($name, static::$registry);

      }

    }

    現(xiàn)在就可以通過如下方式來注冊和注入一個

    <?php

    $book = Ioc::registry('book', function(){

    $book = new Book;

    $book->setdb('...');

    $book->setprice('...');

    return $book;

    });

    //注入依賴

    $book = Ioc::resolve('book');

    ?>

    以上就是針對php依賴注入和控制反轉(zhuǎn)的理解,希望對大家學習PHP程序設計有所幫助。

    更多信息請查看網(wǎng)絡編程
    易賢網(wǎng)手機網(wǎng)站地址:理解php依賴注入和控制反轉(zhuǎn)

    2026上岸·考公考編培訓報班

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)