久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP依賴注入(DI)和控制反轉(IoC)詳解

這篇文章主要介紹了PHP依賴注入(DI)和控制反轉(IoC)的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

首先依賴注入和控制反轉說的是同一個東西,是一種設計模式,這種設計模式用來減少程序間的耦合,鄙人學習了一下,看TP官網還沒有相關的文章,就寫下這篇拙作介紹一下這種設計模式,希望能為TP社區貢獻一些力量。

首先先別追究這個設計模式的定義,否則你一定會被說的云里霧里,筆者就是深受其害,百度了N多文章,都是從理論角度來描述,充斥著大量的生澀詞匯,要么就是java代碼描述的,也生澀。

不管怎么樣,總算弄清楚一些了,下面就以php的角度來描述一下依賴注入這個概念。

先假設我們這里有一個類,類里面需要用到數據庫連接,按照最最原始的辦法,我們可能是這樣寫這個類的:

class example {
  
  private $_db;
  function __construct(){
    include "./Lib/Db.php";
    $this->_db = new Db("localhost","root","123456","test");
  }
  function getList(){
    $this->_db->query("......");//這里具體sql語句就省略不寫了
  }
 }

過程:

在構造函數里先將數據庫類文件include進來;
然后又通過new Db并傳入數據庫連接信息實例化db類;
之后getList方法就可以通過$this->_db來調用數據庫類,實現數據庫操作。

看上去我們實現了想要的功能,但是這是一個噩夢的開始,以后example1,example2,example3....越來越多的類需要用到db組件,如果都這么寫的話,萬一有一天數據庫密碼改了或者db類發生變化了,豈不是要回頭修改所有類文件?
ok,為了解決這個問題,工廠模式出現了,我們創建了一個Factory方法,并通過Factory::getDb()方法來獲得db組件的實例:

class Factory {
  public static function getDb(){
    include "./Lib/Db.php";
    return new Db("localhost","root","123456","test");
  }
 }

sample類變成:

class example {
  
  private $_db;
  function __construct(){
    $this->_db = Factory::getDb();
  }
  function getList(){
    $this->_db->query("......");//這里具體sql語句就省略不寫了
  }
 }

這樣就完美了嗎?再次想想一下以后example1,example2,example3....所有的類,你都需要在構造函數里通過Factory::getDb();獲的一個Db實例,實際上你由原來的直接與Db類的耦合變為了和Factory工廠類的耦合,工廠類只是幫你把數據庫連接信息給包裝起來了,雖然當數據庫信息發生變化時只要修改Factory::getDb()方法就可以了,但是突然有一天工廠方法需要改名,或者getDb方法需要改名,你又怎么辦?當然這種需求其實還是很操蛋的,但有時候確實存在這種情況,一種解決方式是:

我們不從example類內部實例化Db組件,我們依靠從外部的注入,什么意思呢?看下面的例子:

class example {
  private $_db;
  function getList(){
    $this->_db->query("......");//這里具體sql語句就省略不寫了
  }
  //從外部注入db連接
  function setDb($connection){
    $this->_db = $connection;
  }
 }
 //調用
$example = new example();
$example->setDb(Factory::getDb());//注入db連接
$example->getList();

這樣一來,example類完全與外部類解除耦合了,你可以看到Db類里面已經沒有工廠方法或Db類的身影了。我們通過從外部調用example類的setDb方法,將連接實例直接注入進去。這樣example完全不用關心db連接怎么生成的了。
這就叫依賴注入,實現不是在代碼內部創建依賴關系,而是讓其作為一個參數傳遞,這使得我們的程序更容易維護,降低程序代碼的耦合度,實現一種松耦合。

這還沒完,我們再假設example類里面除了db還要用到其他外部類,我們通過:

$example->setDb(Factory::getDb());//注入db連接
$example->setFile(Factory::getFile());//注入文件處理類
$example->setImage(Factory::getImage());//注入Image處理類
 ...

我們沒完沒了的寫這么多set?累不累?
ok,為了不用每次寫這么多行代碼,我們又去弄了一個工廠方法:

class Factory {
  public static function getExample(){
    $example = new example();
    $example->setDb(Factory::getDb());//注入db連接
    $example->setFile(Factory::getFile());//注入文件處理類
    $example->setImage(Factory::getImage());//注入Image處理類
    return $expample;
  }
 }

實例化example時變為:

$example=Factory::getExample();
$example->getList();
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 日韩精品一区二区三区第95 | 午夜欧美a级理论片915影院 | 亚洲一区二区三 | 午夜精品一区二区三区在线视 | a久久| 精品久久久久久 | 久久久精 | 亚洲成人免费在线观看 | 精品国产欧美一区二区 | 欧美精品久久久久久久久久 | 中文字幕av在线播放 | 国产视频福利在线观看 | 久久高清免费视频 | 成人婷婷 | 亚洲精品视频在线观看视频 | 久久久精品一区二区三区 | 久久精品亚洲精品国产欧美 | 久久精品国产a三级三级三级 | 国产成人高清视频 | 毛片.com| 91精品久久 | 91亚洲精品在线观看 | 99精品免费久久久久久日本 | 午夜国产一区 | 色一情一乱一伦一区二区三区 | 成人av鲁丝片一区二区小说 | 欧美日韩一本 | 亚洲福利一区 | 亚洲精品黄色 | 中文字幕av高清 | 中文字幕日韩欧美 | 午夜精品福利视频 | 亚洲风情在线观看 | 亚洲一区二区三区在线 | 免费av手机在线观看 | 亚洲一区 中文字幕 | 综合久久久久久久 | 国产精品一区二区久久 | 欧美一区二区 | 欧美一区二区三区在线观看 | 国产一级片免费视频 |