1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      控制反轉(zhuǎn)原則,它和依賴注入有什么聯(lián)系

      控制反轉(zhuǎn)(IOC)

      成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供昂昂溪網(wǎng)站建設(shè)、昂昂溪做網(wǎng)站、昂昂溪網(wǎng)站設(shè)計、昂昂溪網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、昂昂溪企業(yè)網(wǎng)站模板建站服務(wù),十余年昂昂溪做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

      首先,我們來看一個例子。

      class Person
      {
         private $name = '';
         private $age = 0;
      
         public function __construct(string $name, int $age)
         {
             $this->name = $name;
             $this->age = $age;
         }
      
         public function eat ()
         {
             echo '吃東西' . PHP_EOL;
         }
      
         public function drink ()
         {
             echo '喝水' . PHP_EOL;
         }
      
         public function sleep ()
         {
             echo '睡覺' . PHP_EOL;
         }
      
         public function wakeup ()
         {
             echo '起床' . PHP_EOL;
         }
      
         public function drive ()
         {
             echo '開車' . PHP_EOL;
         }
      
         public function wash ()
         {
             echo '洗漱' . PHP_EOL;
         }
      }

      小明現(xiàn)在早上起來需要去上班,那么小明需要做以下事情

      $person = new Person('小明', 24);
      $person->wakeup();
      $person->wash();
      $person->eat();
      echo '帶上車鑰匙、手機、電腦' .PHP_EOL;
      $person->drive();

      上面的流程都是由程序員自己控制的。現(xiàn)在,我們想辦法,讓框架來控制流程。我們在Person類中新增一個方法,代碼如下:

      public function work (callable $bring)
      {
          $this->wakeup();
          $this->wash();
          $this->eat();
          $bring();
          $this->drive();
      }

      小黃也需要去上班,現(xiàn)在他只安裝框架的指導(dǎo)就可以完成上班的動作了。

      $person = new Person('小黃', 29);
      $person->work(function ()
      {
          echo '帶上手機、車鑰匙、文件' . PHP_EOL;
      });

      修改后的代碼完成了控制反轉(zhuǎn),以前的代碼整個上班的流程由程序員控制,修改后的是由框架控制上班的流程的。程序的流程控制由程序員“反轉(zhuǎn)”到了框架。

      現(xiàn)在可以給出控制反轉(zhuǎn)的定義了:

      實際上,控制反轉(zhuǎn)是一個比較籠統(tǒng)的設(shè)計思想,并不是一種具體的實現(xiàn)方法,一般用來指導(dǎo)框架層面的設(shè)計。這里所說的“控制”指的是對程序執(zhí)行流程的控制,而“反轉(zhuǎn)”指的是在沒有使用框架之前,程序員自己控制整個程序的執(zhí)行。在使用框架之后,整個程序的執(zhí)行流程通過框架來控制。流程的控制權(quán)從程序員“反轉(zhuǎn)”給了框架。

      依賴注入

      控制反轉(zhuǎn)是一種設(shè)計思想,而依賴注入是一種具體的編碼技巧,依賴注入是實現(xiàn)控制反轉(zhuǎn)最常用的技巧。依賴注入看起來“高大上”,實際上非常容易理解和掌握。

      那到底什么是依賴注入呢?我們用一句話來概括就是:不通過 new() 的方式在類內(nèi)部創(chuàng)建依賴類對象,而是將依賴的類對象在外部創(chuàng)建好之后,通過構(gòu)造函數(shù)、函數(shù)參數(shù)等方式傳遞(或注入)給類使用。

      下面來看一個實例:

      interface Log
      {
         function write (string $msg);
      }
      
      class TextLog implements Log
      {
         public function __construct($dirname, $txtname)
         {
             $this->makeDir($dirname);
             $this->mkTxt($txtname);
         }
      
         private function makeDir (string $dirName) :void
         {
             // do something
         }
      
         private function mkTxt (string $txtName) :void
         {
             // do something
         }
      
         public function write (string $msg)
         {
             // do something
         }
      }
      
      class RedisLog implements Log
      {
         private $redis = null;
         private $key = '';
      
         public function __construct(string $key)
         {
             $this->redis = '...'; // 獲取redis實例
             $this->key = $key;
             // ...
         }
      
         public function write (string $msg)
         {
             // do something
         }
      }
      
      class App
      {
         public function run ()
         {
             // do something
      
             // 記錄日志
             (new RedisLog('log'))->write('框架運行信息記錄');
         }
      }

      可以看到,App類依賴RedisLog類,如果我們今后不再使用redis來記錄日子,而改用文本文件的話,那么就需要修改run里面的代碼。

      現(xiàn)在,我們換成使用依賴注入這種技巧來改寫,代碼如下;

      class App
      {
         private $logHandle = null;
      
         public function __construct(Log $log)
         {
             $this->logHandle = $log;
         }
      
         public function run ()
         {
             // do something
      
             // 記錄日志
             $this->logHandle->write('框架運行信息記錄');
         }
      }

      改寫后的App類不再依賴RedisLog類,可以隨時換成其他的Log類,只要該類實現(xiàn)了write方法即可。可以看到,使用了依賴注入,可以靈活的替換掉所依賴的類,另外它是編寫可測試代碼最有效的手段。

      知乎里有一篇將依賴注入的文章,寫的非常通俗易懂,大家也可以去看看。鏈接如下:

      淺談控制反轉(zhuǎn)與依賴注入 https://zhuanlan.zhihu.com/p/33492169
      分享題目:控制反轉(zhuǎn)原則,它和依賴注入有什么聯(lián)系
      網(wǎng)站路徑:http://www.ef60e0e.cn/article/cphscg.html

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        江陵县| 四平市| 玉田县| 三明市| 都江堰市| 黑龙江省| 永康市| 博兴县| 金平| 大新县| 翁源县| 湖南省| 富裕县| 特克斯县| 美姑县| 广平县| 施甸县| 天祝| 阿克陶县| 本溪市| 长寿区| 垣曲县| 抚宁县| 和田市| 图们市| 威海市| 安溪县| 会昌县| 汉沽区| 象山县| 仲巴县| 鄢陵县| 调兵山市| 斗六市| 荆州市| 张家港市| 基隆市| 土默特右旗| 贡觉县| 洛隆县| 天门市|