欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP依賴注入容器知識點淺析

 更新時間:2020年01月20日 10:19:11   作者:silencement  
在本篇文章里小編給大家分享的是一篇關(guān)于PHP依賴注入容器知識點內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。

依賴注入容器理解

耦合

一個好的代碼結(jié)構(gòu)設(shè)計一定是松耦合的,這也是很多通用設(shè)計模式的宗旨,就是把分散在各處的同一個功能的代碼匯聚到一起,形成一個模塊,然后在不同模塊之間通過一些細(xì)小的、明確的渠道進(jìn)行溝通。

在實踐中,不同功能和模塊之間的互相依賴是不可避免的,而如何處理好這些依賴之間的關(guān)系則是代碼結(jié)構(gòu)能否變得美好的關(guān)鍵。

<?php

class User

{

  public function register($user)

  {

    // 注冊操作

    ...

 

    // 發(fā)送確認(rèn)郵件

    $notify = new Notify();

    $notify->sendEmail('register', $user);

  }

}

 

class Notify

{

  public function sendEmail($type, $data)

  {

    switch $type {

      case 'register':

        // 發(fā)送注冊確認(rèn)郵件

        $email = new Email($type);

        $email->send($data);

      ...

    }

  }

}

 

class Email

{

  public function send($data)

  {

    // 發(fā)送郵件

  }

}

上述代碼中,三個類之間逐層依賴,三個類實例化的順序是 User -> Notify -> Email

也就是說我先實例化User類,可能執(zhí)行了一些代碼之后再去實例化我需要的其他類,比如Notify,以此類推。

這種依賴會讓我們不得不為了得到需要的依賴而去做的一些準(zhǔn)備工作,有時候可能一個new操作還不夠。而這部分工作就是所說的耦合,他會讓一個獨立功能的類不得不去關(guān)心一些和自己的主體功能沒什么關(guān)系的操作。

解除一個類對其他類的依賴

要解決這個問題也很簡單,我可以先實例化好Email類,然后再實例化Notify,然后把Email對象作為參數(shù)傳給Notify,最后實例化User類,然后把Notify傳進(jìn)去。這就是所謂的依賴注入,可以看到這個過程中類實例化的順序完全反過來了,先實例化被依賴的對象,而不是先實例化最終需要的對象,這是控制反轉(zhuǎn)。

代碼如下:

<?php

$email = new Email();

$notify = new Notify($email);

$user = new User($notify);

可以通過構(gòu)造函數(shù)來注入需要的依賴,也可以用一些其他的方法。

用容器托管依賴

那又有新的問題,例子中只有三個類還好,那如果這個User類依賴Notify來發(fā)郵件,依賴Model來存數(shù)據(jù)庫,依賴redis來緩存,這樣固然把依賴關(guān)系轉(zhuǎn)移到了類的外部,但還是會導(dǎo)致我只想實例化一下User的時候,卻要手動做很多的準(zhǔn)備工作,會讓代碼混亂。所以這個時候需要一個容器。而這個容器的作用就是替我來管理這些依賴。

<?php

// 容器

class Container implements ArrayAccess

{

  protected $values = [];

 

  public function offsetGet($offset) 

  {

    return $this->values[$offset]($this);

  }

 

  public function offsetSet($offset, $value) 

  {

    $this->values[$offset] = $value;

  }

}

在程序啟動的時候,我們可以在一個地方統(tǒng)一的注冊好一系列的基礎(chǔ)服務(wù)。

<?php

$container = new Container();

 

$container['notify'] = function($c) {

  return new Notify();

};

 

$container['email'] = function($c) {

  return new Email();

};

就會變成這樣

<?php

class User

{

  public function register($user)

  {

    // 注冊操作

    ...

 

    // 發(fā)送確認(rèn)郵件

    $container('notify')->sendEmail('register', $user);

  }

}

 

class Notify

{

  public function sendEmail($type, $data)

  {

    switch $type {

      case 'register':

        // 發(fā)送注冊確認(rèn)郵件

        $email = $container['email'];

        $email->send($data);

      ...

    }

  }

}

 

class Email

{

  public function send($data)

  {

    // 發(fā)送郵件

  }

}

就是當(dāng)User需要Notify的時候,會去向容器要這個類的對象,那至于Notify再依賴什么其他的東西,我就不用管了,因為Notify也會去向容器要它自己需要的依賴。所有這些依賴關(guān)系的處理就完全托管給容器了,我們既不需要去關(guān)心依賴之間的層次關(guān)系,也避免了依賴之間的耦合。

需要注意的是,依賴注入容器一般只接受一個匿名函數(shù),而不是一個實例化好的對象,匿名函數(shù)會告訴容器怎樣去獲得一個對象,這樣可以使得一個服務(wù)在被需要的時候才會去實例化

以上就是本次介紹的全部相關(guān)知識點,感謝大家的學(xué)習(xí)和對腳本之家的支持。

相關(guān)文章

  • 常用的php對象類型判斷

    常用的php對象類型判斷

    整理的一些常用的php數(shù)值判斷函數(shù),保存為php文件
    2008-08-08
  • php去除字符串兩邊空格、空字符串和換行符的方法

    php去除字符串兩邊空格、空字符串和換行符的方法

    這篇文章給大家介紹了php去除字符串兩邊空格、空字符串和換行符的方法,文中有詳細(xì)的代碼示例,對大家的學(xué)習(xí)或工作具有一定的參考價值,需要的朋友可以參考下
    2023-11-11
  • php中序列化與反序列化詳解

    php中序列化與反序列化詳解

    本文介紹了php中序列化與反序列化的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • php實現(xiàn)四舍五入的方法小結(jié)

    php實現(xiàn)四舍五入的方法小結(jié)

    這篇文章主要介紹了php實現(xiàn)四舍五入的方法,實例總結(jié)了php實現(xiàn)四舍五入的三種常用方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • PHP實用小技巧之調(diào)用錄像的方法

    PHP實用小技巧之調(diào)用錄像的方法

    這篇文章主要給大家介紹了關(guān)于PHP實用小技巧之調(diào)用錄像的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者實用PHP具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • php使用ereg驗證文件上傳的方法

    php使用ereg驗證文件上傳的方法

    這篇文章主要介紹了php使用ereg驗證文件上傳的方法,是非常簡單實用的正則驗證技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • php 抽象類的簡單應(yīng)用

    php 抽象類的簡單應(yīng)用

    我想博客中的 文章列表和單個的文章閱讀 統(tǒng)一起來,我覺得除了sql查詢語句結(jié)構(gòu)不同,HTML代碼不同,其它也就一樣。不過話說回來,這兩個都是主要功能,所以這的確有點不適合,不過昨晚讀了一點設(shè)計模式,好歹得寫點啥好。
    2011-09-09
  • PHP實現(xiàn)獲取并生成數(shù)據(jù)庫字典的方法

    PHP實現(xiàn)獲取并生成數(shù)據(jù)庫字典的方法

    這篇文章主要介紹了PHP實現(xiàn)獲取并生成數(shù)據(jù)庫字典的方法,可實現(xiàn)讀取數(shù)據(jù)庫并列出詳細(xì)數(shù)據(jù)庫信息的功能,需要的朋友可以參考下
    2016-05-05
  • php安裝dblib擴展,連接mssql的具體步驟

    php安裝dblib擴展,連接mssql的具體步驟

    下面小編就為大家?guī)硪黄猵hp安裝dblib擴展,連接mssql的具體步驟。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • windows下安裝php的memcache模塊的方法

    windows下安裝php的memcache模塊的方法

    這篇文章主要介紹了windows下安裝php_memcache模塊的方法,十分詳細(xì),也非常簡單,這里推薦給有需要的小伙伴參考下
    2015-04-04

最新評論