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

主頁 > 知識庫 > PHP進(jìn)階學(xué)習(xí)之依賴注入與Ioc容器詳解

PHP進(jìn)階學(xué)習(xí)之依賴注入與Ioc容器詳解

熱門標(biāo)簽:廣東廣州在怎么申請400電話 咸寧銷售電銷機(jī)器人系統(tǒng) 電銷機(jī)器人問門薩維品牌my 百度地圖怎樣標(biāo)注圖標(biāo) 400電話蘭州申請請 余姚電話機(jī)器人 開發(fā)地圖標(biāo)注類網(wǎng)站 百度地圖標(biāo)注偏差 外呼系統(tǒng)能給企業(yè)帶來哪些好處

本文實例講述了PHP依賴注入與Ioc容器。分享給大家供大家參考,具體如下:

背景

在很多編程語言(例如java)開發(fā)中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調(diào)用類實例的方法,這種開發(fā)存在的問題是new的類實例不好統(tǒng)一管理,一旦有修改,牽扯的類會很多。

最早在java的spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。目前許多主流PHP框架也使用了依賴注入容器,如ThinkPHP、Laravel等。

一、概念

1、容器:字面上理解就是裝東西的東西。常見的變量、對象屬性等都可以算是容器。一個容器能夠裝什么,全部取決于你對該容器的定義。當(dāng)然,現(xiàn)在我們討論的是這樣一種容器,它存放的不是文本、數(shù)值,而是對象、對象的描述(類、接口)或者是提供對象的回調(diào)(閉包),通過這種容器,我們得以實現(xiàn)許多高級的功能,其中最常提到的,就是 “解耦”、“依賴注入”。

2、IoC - Inversion of Control 控制反轉(zhuǎn) 

控制反轉(zhuǎn)是從容器的角度在描述,即:容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。 

3、DI - Dependency Injection 依賴注入 

依賴注入是從應(yīng)用程序的角度在描述,可以把依賴注入,即:應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源。

備注:依賴注入和控制反轉(zhuǎn)說的是同一個東西,是一種設(shè)計模式,這種設(shè)計模式用來減少程序間的耦合,從某個方面講,就是它們描述的角度不同。 

二、依賴注入的原理

一般情況下,當(dāng)存在類與類之間的依賴關(guān)系的時候,我們都是通過直接實例化的方式進(jìn)行調(diào)用。一旦出現(xiàn)多層依賴,這種方式的耦合程度就很高,在需要修改其中一個類的時候,會牽扯很多依賴它的類的修改,因此對代碼的改動會比較大。

下面簡單舉一個A->B->C三層依賴的關(guān)系解釋怎么運(yùn)用依賴注入來解耦,提高開發(fā)效率。

而依賴注入方式如下:

解析:

常規(guī)寫法里面,一旦C類需要作出改變,或者B類的調(diào)用需要改變成D類的時候,還需要考慮到依賴自己的B類,即還需要對B類作出修改。

依賴注入的思想就是即用即實例,反轉(zhuǎn)類與類之間的控制關(guān)系,實現(xiàn)由調(diào)用類A類控制后續(xù)的依賴關(guān)系,這樣可以讓B類隨意的更改所需依賴和實例化的類(C類或D類),達(dá)到解耦的目的。

三、常用的依賴注入方式:

1、構(gòu)造方法注入;2、set屬性注入;3、靜態(tài)工廠方法注入;

上述的例子使用的就是構(gòu)造方法注入的方式,將對象作為參數(shù)傳遞到構(gòu)造方法中;同樣的set屬性注入也是相類似的方法,不同的僅僅是在set一個類的成員的屬性時傳遞這個對象參數(shù),在此就不一一舉例了。

除此之外,還有靜態(tài)工廠方法注入的方式,這種方法與靜態(tài)工廠方法類似。

我們知道靜態(tài)工廠方法就是通過一個類來管理需要實例化的多個相似的類,該類會定義一個方法用于獲取需要實例化的對象,而具體要實例化哪個對象就依賴于傳遞進(jìn)來的對象名參數(shù)了。

對于靜態(tài)工廠方式的注入,與一般的靜態(tài)工廠方法不同之處在于這個傳進(jìn)來的參數(shù)是一個已經(jīng)實例化過的對象。

?php
class IoC
{
  protected static $registry = [];
  public static function bind($name, Callable $resolver) //傳入類名和類對象實例
  {
    static::$registry[$name] = $resolver;
  }
  public static function make($name) //靜態(tài)工廠方法
  {
    if (isset(static::$registry[$name])) {
      $resolver = static::$registry[$name];
      return $resolver(); //實例化
    }
    throw new Exception('Alias does not exist in the IoC registry.');
  }
}

總而言之,三種方式傳遞的都是實例化對象,只是不同之處在于傳遞的位置分別為構(gòu)造方法、set屬性、靜態(tài)工廠方法而已。

四、依賴注入容器(Ioc容器)

大多數(shù)時侯,在使用依賴注入方式解耦組件時,并不需要用到容器。
當(dāng)一段程序需要實例化的類太多或者依賴太多的時候,重復(fù)依賴注入的代碼是比較繁瑣的事情,例如以下情況:

當(dāng)產(chǎn)生以上關(guān)系的時候,依賴注入的代碼會比較混亂,而且存在重復(fù),更有可能在調(diào)用一個一般方法時new一個不需要的類,產(chǎn)生冗余。

此時需要使用容器,使用依賴注入容器后的思路是應(yīng)用程序需要到A類,就從容器內(nèi)取得A類。具體是容器創(chuàng)建C類,再創(chuàng)建B類并把C注入,再創(chuàng)建A類,并把B類注入,應(yīng)用程序調(diào)用A類方法, A類調(diào)用B類方法,接著做些其它工作.總之容器負(fù)責(zé)實例化,注入依賴,處理依賴關(guān)系等工作。

對于實際開發(fā)中復(fù)雜多變的代碼環(huán)境,我們并不能完全知道現(xiàn)在的類在未來會擴(kuò)展成什么情況,因此我們需要在有新的依賴類加入的時候,通過容器去實現(xiàn)實例化該類的方法。因此,在實例化未知類的時候,最能探索一個類的內(nèi)部結(jié)構(gòu)和實例化的方法就是利用反射,由此可知,反射是容器管理各個依賴類的核心。我們可以通過實例來了解容器的內(nèi)部實現(xiàn):

三個存在依賴關(guān)系的類:文件testClass.php

?php //依賴關(guān)系:Company->Department->Group
class Group
{
  public function doSomething()
  {
    echo __CLASS__.":".'hello', '|';
  }
}
class Department
{
  private $group;
  public function __construct(Group $group)
  {
    $this->group = $group;
  }
  public function doSomething()
  {
    $this->group->doSomething();
    echo __CLASS__.":".'hello', '|';
  }
}
class Company
{
  private $department;
  public function __construct(Department $department)
  {
    $this->department = $department;
  }
  public function doSomething()
  {
    $this->department->doSomething();
    echo __CLASS__.":".'hello', '|';
  }
}

Ioc容器的內(nèi)部實現(xiàn):

?php
class Container
{
  private $s = array();
  public function __set($k, $c)
  {
    $this->s[$k] = $c;
  }
  public function __get($k)
  {
    return $this->build($this->s[$k]);
  }
  /**
   * 自動綁定(Autowiring)自動解析(Automatic Resolution)
   *
   * @param string $className
   * @return object
   * @throws Exception
   */
  public function build($className)
  {
    // 如果是匿名函數(shù)(Anonymous functions),也叫閉包函數(shù)(closures)
    if ($className instanceof Closure) {
      // 執(zhí)行閉包函數(shù),并將結(jié)果
      return $className($this);
    }
    /*通過反射獲取類的內(nèi)部結(jié)構(gòu),實例化類*/
    $reflector = new ReflectionClass($className);
    // 檢查類是否可實例化, 排除抽象類abstract和對象接口interface
    if (!$reflector->isInstantiable()) {
      throw new Exception("Can't instantiate this.");
    }
    /** @var ReflectionMethod $constructor 獲取類的構(gòu)造函數(shù) */
    $constructor = $reflector->getConstructor();
    // 若無構(gòu)造函數(shù),直接實例化并返回
    if (is_null($constructor)) {
      return new $className;
    }
    // 取構(gòu)造函數(shù)參數(shù),通過 ReflectionParameter 數(shù)組返回參數(shù)列表
    $parameters = $constructor->getParameters();
    // 遞歸解析構(gòu)造函數(shù)的參數(shù)
    $dependencies = $this->getDependencies($parameters);
    // 創(chuàng)建一個類的新實例,給出的參數(shù)將傳遞到類的構(gòu)造函數(shù)。
    return $reflector->newInstanceArgs($dependencies);
  }
  /**
   * @param array $parameters
   * @return array
   * @throws Exception
   */
  public function getDependencies($parameters)
  {
    $dependencies = [];
    /** @var ReflectionParameter $parameter */
    foreach ($parameters as $parameter) {
      /** @var ReflectionClass $dependency */
      $dependency = $parameter->getClass();
      if (is_null($dependency)) {
        // 是變量,有默認(rèn)值則設(shè)置默認(rèn)值
        $dependencies[] = $this->resolveNonClass($parameter);
      } else {
        // 是一個類,遞歸解析
        $dependencies[] = $this->build($dependency->name);
      }
    }
    return $dependencies;
  }
  /**
   * @param ReflectionParameter $parameter
   * @return mixed
   * @throws Exception
   */
  public function resolveNonClass($parameter)
  {
    // 有默認(rèn)值則返回默認(rèn)值
    if ($parameter->isDefaultValueAvailable()) {
      return $parameter->getDefaultValue();
    }
    throw new Exception('I have no idea what to do here.');
  }
}
require_once "./testclass.php"; //開始測試,先測試已知依賴關(guān)系的情況
$c = new Container();
$c->department = 'Department';
$c->company = function ($c) {
  return new Company($c->department);
};
// 從容器中取得company
$company = $c->company;
$company->doSomething(); //輸出: Group:hello|Department:hello|Company:hello|
// 測試未知依賴關(guān)系,直接使用的方法
$di = new Container();
$di->company = 'Company';
$company = $di->company;
$company->doSomething();//輸出: Group:hello|Department:hello|Company:hello|

我們可以通過一張圖解釋Ioc容器的內(nèi)部邏輯:

五、總結(jié)

IOC的基本概念是:不創(chuàng)建對象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對象和服務(wù)連接,但在配置文件中描述哪一個組件需要哪一項服務(wù)。Spring容器負(fù)責(zé)將這些聯(lián)系在一起。也就是說,Spring的IOC負(fù)責(zé)管理各種對象的創(chuàng)建、清除以及它們之間的聯(lián)系。 

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設(shè)計有所幫助。

您可能感興趣的文章:
  • 詳解php命令注入攻擊
  • php使用exec shell命令注入的方法講解
  • 淺析PHP反序列化中過濾函數(shù)使用不當(dāng)導(dǎo)致的對象注入問題
  • PHP依賴注入容器知識點淺析
  • PHP使用PDO實現(xiàn)mysql防注入功能詳解
  • PHP防止sql注入小技巧之sql預(yù)處理原理與實現(xiàn)方法分析
  • php+laravel依賴注入知識點總結(jié)
  • php依賴注入知識點詳解
  • php中的依賴注入實例詳解
  • thinkphp5.1框架容器與依賴注入實例分析
  • php反射學(xué)習(xí)之依賴注入示例
  • CTF命令執(zhí)行及繞過技巧

標(biāo)簽:麗江 臨沂 衡陽 重慶 十堰 銅陵 鷹潭 巴彥淖爾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP進(jìn)階學(xué)習(xí)之依賴注入與Ioc容器詳解》,本文關(guān)鍵詞  PHP,進(jìn)階,學(xué),習(xí)之,依賴,注入,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP進(jìn)階學(xué)習(xí)之依賴注入與Ioc容器詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP進(jìn)階學(xué)習(xí)之依賴注入與Ioc容器詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕一区二区视频| 国产一区二区0| 欧美在线一二三四区| 黄页视频在线91| 亚洲香肠在线观看| 精品国产乱码久久久久久免费| 成人午夜碰碰视频| 青青草91视频| 午夜欧美在线一二页| 中文字幕在线一区二区三区| 7777精品伊人久久久大香线蕉超级流畅 | 精品一区二区三区影院在线午夜| 一区精品在线播放| 久久久久久久精| 69久久夜色精品国产69蝌蚪网| 97se亚洲国产综合自在线| 国产成人综合自拍| 国产美女一区二区| 精品一区二区三区免费毛片爱| 五月天亚洲精品| 亚洲一区在线看| 亚洲主播在线播放| 亚洲人吸女人奶水| 亚洲欧美激情在线| 一区二区高清免费观看影视大全| 亚洲视频免费看| 一区二区三区中文字幕在线观看| 中文字幕一区二区三区不卡| 国产精品蜜臀在线观看| 国产精品成人免费| 一区二区欧美精品| 亚洲综合一区二区| 亚洲国产欧美日韩另类综合| 午夜精品视频在线观看| 视频一区在线视频| 久久99蜜桃精品| 国产精品一区在线| 国产精品538一区二区在线| 激情丁香综合五月| 成人av动漫在线| 色播五月激情综合网| 亚洲一区二区在线免费看| 欧美日韩大陆在线| 国产欧美中文在线| 韩国毛片一区二区三区| 偷拍亚洲欧洲综合| 欧美激情综合网| 欧美成人女星排名| 国产拍欧美日韩视频二区| 中文字幕精品综合| 国产在线日韩欧美| 国产精品国产三级国产aⅴ无密码| 亚洲精品欧美在线| 91社区在线播放| 亚洲第一二三四区| 7777精品久久久大香线蕉 | 亚洲午夜日本在线观看| 国产麻豆精品95视频| 亚洲精品一区二区在线观看| 91精品一区二区三区在线观看| 色婷婷激情综合| 亚洲国产日产av| 91九色02白丝porn| 久久成人av少妇免费| 国产片一区二区三区| 欧美精品vⅰdeose4hd| 精品无人区卡一卡二卡三乱码免费卡| 欧美精品一区二区不卡 | 国产亚洲婷婷免费| 奇米精品一区二区三区四区| 中文字幕+乱码+中文字幕一区| 欧美日韩在线不卡| 蜜臀久久久久久久| 国产免费成人在线视频| 亚洲成av人片在线观看无码| 色婷婷国产精品| 日韩av网站在线观看| 欧美大片日本大片免费观看| 91福利在线免费观看| 极品少妇xxxx偷拍精品少妇| 国产成都精品91一区二区三| 国内精品视频666| 色一区在线观看| 欧美不卡一区二区三区四区| 亚洲另类在线制服丝袜| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | |精品福利一区二区三区| 五月婷婷另类国产| 91丨porny丨国产| 精品国产乱码久久久久久图片 | 中文字幕的久久| 一本一道久久a久久精品| 91麻豆产精品久久久久久| 在线观看av一区| 2023国产一二三区日本精品2022| 亚洲综合一二三区| 97精品国产露脸对白| 国产精品福利影院| 91美女蜜桃在线| 国产精品女人毛片| 成人高清免费观看| 久久免费视频色| 日韩高清电影一区| 99九九99九九九视频精品| 国产日韩欧美高清| 成人激情小说乱人伦| 日韩精品国产欧美| 久久久久综合网| 国产精品一区在线观看你懂的| 91精品国产综合久久精品图片| 亚洲精品伦理在线| 欧美羞羞免费网站| 国产成人午夜视频| 五月婷婷激情综合网| 国产精品热久久久久夜色精品三区 | 国产精品传媒入口麻豆| 精品视频在线视频| 久久精品国产亚洲高清剧情介绍| 在线综合+亚洲+欧美中文字幕| 国产真实乱对白精彩久久| 亚洲视频 欧洲视频| 欧美大尺度电影在线| 欧美日韩亚洲丝袜制服| 成人国产精品免费网站| 日韩成人一区二区三区在线观看| 欧美精品丝袜久久久中文字幕| 亚洲第一在线综合网站| 日韩一区二区三区在线观看| 国产一区二区三区免费观看| 亚洲免费大片在线观看| 日韩欧美亚洲一区二区| 成人国产精品免费观看| 日韩精品欧美精品| 五月婷婷激情综合网| 综合自拍亚洲综合图不卡区| 成人免费视频在线观看| 337p日本欧洲亚洲大胆色噜噜| 99国产精品视频免费观看| 国产一区二区成人久久免费影院| 日韩中文字幕不卡| 亚洲综合色自拍一区| 国产精品欧美极品| 久久精品亚洲精品国产欧美| 日韩欧美久久一区| 久久久欧美精品sm网站 | 欧美高清在线精品一区| 国产精品免费久久| 久久久美女毛片| 欧美性受极品xxxx喷水| 成人18视频日本| 成人免费电影视频| 欧美成人精精品一区二区频| 欧美午夜免费电影| 9191久久久久久久久久久| 欧美一区午夜视频在线观看| 欧美日韩中字一区| 精品乱人伦小说| 国产精品国产三级国产普通话99| 欧美极品少妇xxxxⅹ高跟鞋 | 国产精品久久久久久久久果冻传媒| 亚洲欧洲日韩在线| 午夜国产精品影院在线观看| 风流少妇一区二区| 日韩欧美高清dvd碟片| 国产精品久久久久影院亚瑟 | 99久久免费精品高清特色大片| 欧美日韩国产另类不卡| 久久免费视频一区| 国产精品久久久久影视| 久久精品噜噜噜成人88aⅴ| 欧美日韩成人综合| 亚洲欧美成aⅴ人在线观看| 久久www免费人成看片高清| 六月丁香综合在线视频| 91免费看视频| 亚洲人成在线播放网站岛国| 国产一区二区三区在线看麻豆| 在线播放91灌醉迷j高跟美女| 国产精品久久久久9999吃药| 亚洲国产成人av| 欧美视频在线一区| 日本不卡视频在线| 欧美二区在线观看| 国产精品美日韩| 国产精品一区二区视频| 欧美成人三级电影在线| 成人免费视频视频| 亚洲精品中文字幕在线观看| 国产aⅴ综合色| 日韩一区二区免费视频| 另类专区欧美蜜桃臀第一页| 国产人成一区二区三区影院| 成人激情午夜影院| 蜜臀av性久久久久av蜜臀妖精| 欧美美女bb生活片| 青青草原综合久久大伊人精品优势| 91精品福利在线一区二区三区| 国产剧情在线观看一区二区| 国产日韩欧美在线一区| 亚洲激情欧美激情|