婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP依賴注入容器知識點淺析

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

熱門標簽:青島語音外呼系統招商 揚州地圖標注app 山西回撥外呼系統 昭通辦理400電話 河南電銷卡外呼系統哪家強 山西探意電話機器人 騰訊外呼管理系統 百應電話機器人服務 岳陽外呼型呼叫中心系統在哪里

依賴注入容器理解

耦合

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

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

?php

class User

{

  public function register($user)

  {

    // 注冊操作

    ...

 

    // 發送確認郵件

    $notify = new Notify();

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

  }

}

 

class Notify

{

  public function sendEmail($type, $data)

  {

    switch $type {

      case 'register':

        // 發送注冊確認郵件

        $email = new Email($type);

        $email->send($data);

      ...

    }

  }

}

 

class Email

{

  public function send($data)

  {

    // 發送郵件

  }

}

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

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

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

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

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

代碼如下:

?php

$email = new Email();

$notify = new Notify($email);

$user = new User($notify);

可以通過構造函數來注入需要的依賴,也可以用一些其他的方法。

用容器托管依賴

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

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

  }

}

在程序啟動的時候,我們可以在一個地方統一的注冊好一系列的基礎服務。

?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)

  {

    // 注冊操作

    ...

 

    // 發送確認郵件

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

  }

}

 

class Notify

{

  public function sendEmail($type, $data)

  {

    switch $type {

      case 'register':

        // 發送注冊確認郵件

        $email = $container['email'];

        $email->send($data);

      ...

    }

  }

}

 

class Email

{

  public function send($data)

  {

    // 發送郵件

  }

}

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

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

以上就是本次介紹的全部相關知識點,感謝大家的學習和對腳本之家的支持。

您可能感興趣的文章:
  • php+laravel依賴注入知識點總結
  • laravel框架中你所用到的依賴注入詳解
  • 通過源碼解析Laravel的依賴注入
  • Laravel實現構造函數自動依賴注入的方法
  • php依賴注入知識點詳解
  • php中的依賴注入實例詳解
  • php反射學習之依賴注入示例
  • PHP依賴注入原理與用法分析
  • 詳解Laravel框架的依賴注入功能

標簽:婁底 銅川 鎮江 黃南 宜賓 寶雞 南陽 湛江

巨人網絡通訊聲明:本文標題《PHP依賴注入容器知識點淺析》,本文關鍵詞  PHP,依賴,注入,容器,知識點,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP依賴注入容器知識點淺析》相關的同類信息!
  • 本頁收集關于PHP依賴注入容器知識點淺析的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 香港| 长治县| 麻江县| 南丰县| 东辽县| 隆化县| 阜康市| 玛沁县| 偃师市| 甘孜县| 溧水县| 县级市| 响水县| 大理市| 襄垣县| 友谊县| 伊川县| 姚安县| 台山市| 革吉县| 奇台县| 富平县| 囊谦县| 韩城市| 铁力市| 浦江县| 武功县| 建宁县| 增城市| 壶关县| 太康县| 迁安市| 宜春市| 特克斯县| 石屏县| 浑源县| 宽甸| 林州市| 静海县| 景泰县| 游戏|