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

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

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

首先依賴注入和控制反轉(zhuǎn)說(shuō)的是同一個(gè)東西,是一種設(shè)計(jì)模式,這種設(shè)計(jì)模式用來(lái)減少程序間的耦合,鄙人學(xué)習(xí)了一下,看TP官網(wǎng)還沒(méi)有相關(guān)的文章,就寫下這篇拙作介紹一下這種設(shè)計(jì)模式,希望能為TP社區(qū)貢獻(xiàn)一些力量。

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

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

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

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

過(guò)程:

在構(gòu)造函數(shù)里先將數(shù)據(jù)庫(kù)類文件include進(jìn)來(lái);
然后又通過(guò)new Db并傳入數(shù)據(jù)庫(kù)連接信息實(shí)例化db類;
之后getList方法就可以通過(guò)$this->_db來(lái)調(diào)用數(shù)據(jù)庫(kù)類,實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。

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

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語(yǔ)句就省略不寫了
  }
 }

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

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

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

這樣一來(lái),example類完全與外部類解除耦合了,你可以看到Db類里面已經(jīng)沒(méi)有工廠方法或Db類的身影了。我們通過(guò)從外部調(diào)用example類的setDb方法,將連接實(shí)例直接注入進(jìn)去。這樣example完全不用關(guān)心db連接怎么生成的了。
這就叫依賴注入,實(shí)現(xiàn)不是在代碼內(nèi)部創(chuàng)建依賴關(guān)系,而是讓其作為一個(gè)參數(shù)傳遞,這使得我們的程序更容易維護(hù),降低程序代碼的耦合度,實(shí)現(xiàn)一種松耦合。

這還沒(méi)完,我們?cè)偌僭O(shè)example類里面除了db還要用到其他外部類,我們通過(guò):

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

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

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;
  }
 }

實(shí)例化example時(shí)變?yōu)椋?br />

$example=Factory::getExample();
$example->getList();
【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡(jiǎn)單分析了插值查找算法的概念、原理并結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)針對(duì)有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁(yè)的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
下面小編就為大家分享一篇PHP實(shí)現(xiàn)APP微信支付的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要介紹了PHP實(shí)現(xiàn)的多維數(shù)組排序算法,結(jié)合實(shí)例形式對(duì)比分析了php針對(duì)多維數(shù)組及帶有鍵名的多維數(shù)組進(jìn)行排序相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php結(jié)合ajaxuploadfile實(shí)現(xiàn)無(wú)刷新文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細(xì)介紹了PHP開(kāi)發(fā)接口使用RSA進(jìn)行加密解密方法,對(duì)此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: 一级免费毛片 | 99视频网 | 在线观看国产免费视频 | 日韩中文字幕第一页 | 国产一及片 | 国产精品免费在线 | 天天躁日日躁狠狠躁 | 91成人在线观看喷潮蘑菇 | 久久久久亚洲精品 | 日韩精品国产精品 | 一级片在线视频 | 国产一级黄色 | 中文字幕一区在线观看 | 91二区| 综合网久久 | 国产一区二区三区在线 | 亚洲精品网站在线观看 | 亚洲一级二级三级 | 一区在线视频 | 国产成人午夜精品 | 综合伊人久久 | 成人影片在线 | 久久亚洲免费视频 | 免费黄色小说网站 | 国产一级18片视频 | 国产精品久久久久久久久久久久久久 | 91小视频在线观看 | 成人国产精品一区二区 | 福利在线播放 | 一级片久久 | 国产日韩欧美在线 | 黄色av毛片| 热久久中文字幕 | 久久综合av | 欧美久久一区二区 | 青青在线| 成人免费毛片aaaaaa片 | 国产一级视频在线观看 | 伊人av综合 | 一级特黄妇女高潮 | 精品1区 |