亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 淺析PHP類的反射來實(shí)現(xiàn)依賴注入過程

淺析PHP類的反射來實(shí)現(xiàn)依賴注入過程

熱門標(biāo)簽:南寧高頻外呼回?fù)芟到y(tǒng)哪家好 專業(yè)電話機(jī)器人批發(fā)商 400電話申請方法收費(fèi) 電話機(jī)器人危險(xiǎn)嗎 深圳外呼系統(tǒng)收費(fèi) 400電話辦理福州市 離石地圖標(biāo)注 江蘇外呼電銷機(jī)器人報(bào)價(jià) 長沙crm外呼系統(tǒng)業(yè)務(wù)

PHP具有完整的反射 API,提供了對類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行逆向工程的能力。通過類的反射提供的能力我們能夠知道類是如何被定義的,它有什么屬性、什么方法、方法都有哪些參數(shù),類文件的路徑是什么等很重要的信息。也正式因?yàn)轭惖姆瓷浜芏郟HP框架才能實(shí)現(xiàn)依賴注入自動(dòng)解決類與類之間的依賴關(guān)系,這給我們平時(shí)的開發(fā)帶來了很大的方便。 本文主要是講解如何利用類的反射來實(shí)現(xiàn)依賴注入(Dependency Injection),并不會去逐條講述PHP Reflection里的每一個(gè)API,詳細(xì)的API參考信息請查閱官方文檔

為了更好地理解,我們通過一個(gè)例子來看類的反射,以及如何實(shí)現(xiàn)依賴注入。

下面這個(gè)類代表了坐標(biāo)系里的一個(gè)點(diǎn),有兩個(gè)屬性橫坐標(biāo)x和縱坐標(biāo)y。

/**
 * Class Point
 */
class Point
{
  public $x;
  public $y;

  /**
   * Point constructor.
   * @param int $x horizontal value of point's coordinate
   * @param int $y vertical value of point's coordinate
   */
  public function __construct($x = 0, $y = 0)
  {
    $this->x = $x;
    $this->y = $y;
  }
}

接下來這個(gè)類代表圓形,可以看到在它的構(gòu)造函數(shù)里有一個(gè)參數(shù)是Point類的,即Circle類是依賴與Point類的。

class Circle
{
  /**
   * @var int
   */
  public $radius;//半徑

  /**
   * @var Point
   */
  public $center;//圓心點(diǎn)

  const PI = 3.14;

  public function __construct(Point $point, $radius = 1)
  {
    $this->center = $point;
    $this->radius = $radius;
  }
  
  //打印圓點(diǎn)的坐標(biāo)
  public function printCenter()
  {
    printf('center coordinate is (%d, %d)', $this->center->x, $this->center->y);
  }

  //計(jì)算圓形的面積
  public function area()
  {
    return 3.14 * pow($this->radius, 2);
  }
}

ReflectionClass

下面我們通過反射來對Circle這個(gè)類進(jìn)行反向工程。

把Circle類的名字傳遞給reflectionClass來實(shí)例化一個(gè)ReflectionClass類的對象。

$reflectionClass = new reflectionClass(Circle::class);
//返回值如下
object(ReflectionClass)#1 (1) {
 ["name"]=>
 string(6) "Circle"
}

反射出類的常量

$reflectionClass->getConstants();

返回一個(gè)由常量名稱和值構(gòu)成的關(guān)聯(lián)數(shù)組

array(1) {
 ["PI"]=>
 float(3.14)
}

通過反射獲取屬性

$reflectionClass->getProperties();

返回一個(gè)由ReflectionProperty對象構(gòu)成的數(shù)組

array(2) {
 [0]=>
 object(ReflectionProperty)#2 (2) {
  ["name"]=>
  string(6) "radius"
  ["class"]=>
  string(6) "Circle"
 }
 [1]=>
 object(ReflectionProperty)#3 (2) {
  ["name"]=>
  string(6) "center"
  ["class"]=>
  string(6) "Circle"
 }
}

反射出類中定義的方法

$reflectionClass->getMethods();

返回ReflectionMethod對象構(gòu)成的數(shù)組

array(3) {
 [0]=>
 object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(11) "__construct"
  ["class"]=>
  string(6) "Circle"
 }
 [1]=>
 object(ReflectionMethod)#3 (2) {
  ["name"]=>
  string(11) "printCenter"
  ["class"]=>
  string(6) "Circle"
 }
 [2]=>
 object(ReflectionMethod)#4 (2) {
  ["name"]=>
  string(4) "area"
  ["class"]=>
  string(6) "Circle"
 }
}

我們還可以通過getConstructor()來單獨(dú)獲取類的構(gòu)造方法,其返回值為一個(gè)ReflectionMethod對象。

$constructor = $reflectionClass->getConstructor();

反射出方法的參數(shù)

$parameters = $constructor->getParameters();

其返回值為ReflectionParameter對象構(gòu)成的數(shù)組。

array(2) {
 [0]=>
 object(ReflectionParameter)#3 (1) {
  ["name"]=>
  string(5) "point"
 }
 [1]=>
 object(ReflectionParameter)#4 (1) {
  ["name"]=>
  string(6) "radius"
 }
}

依賴注入

好了接下來我們編寫一個(gè)名為make的函數(shù),傳遞類名稱給make函數(shù)返回類的對象,在make里它會幫我們注入類的依賴,即在本例中幫我們注入Point對象給Circle類的構(gòu)造方法。

//構(gòu)建類的對象
function make($className)
{
  $reflectionClass = new ReflectionClass($className);
  $constructor = $reflectionClass->getConstructor();
  $parameters = $constructor->getParameters();
  $dependencies = getDependencies($parameters);
  
  return $reflectionClass->newInstanceArgs($dependencies);
}

//依賴解析
function getDependencies($parameters)
{
  $dependencies = [];
  foreach($parameters as $parameter) {
    $dependency = $parameter->getClass();
    if (is_null($dependency)) {
      if($parameter->isDefaultValueAvailable()) {
        $dependencies[] = $parameter->getDefaultValue();
      } else {
        //不是可選參數(shù)的為了簡單直接賦值為字符串0
        //針對構(gòu)造方法的必須參數(shù)這個(gè)情況
        //laravel是通過service provider注冊closure到IocContainer,
        //在closure里可以通過return new Class($param1, $param2)來返回類的實(shí)例
        //然后在make時(shí)回調(diào)這個(gè)closure即可解析出對象
        //具體細(xì)節(jié)我會在另一篇文章里面描述
        $dependencies[] = '0';
      }
    } else {
      //遞歸解析出依賴類的對象
      $dependencies[] = make($parameter->getClass()->name);
    }
  }

  return $dependencies;
}

定義好make方法后我們通過它來幫我們實(shí)例化Circle類的對象:

$circle = make('Circle');
$area = $circle->area();
/*var_dump($circle, $area);
object(Circle)#6 (2) {
 ["radius"]=>
 int(1)
 ["center"]=>
 object(Point)#11 (2) {
  ["x"]=>
  int(0)
  ["y"]=>
  int(0)
 }
}
float(3.14)*/

通過上面這個(gè)實(shí)例我簡單描述了一下如何利用PHP類的反射來實(shí)現(xiàn)依賴注入,Laravel的依賴注入也是通過這個(gè)思路來實(shí)現(xiàn)的,只不過設(shè)計(jì)的更精密大量地利用了閉包回調(diào)來應(yīng)對各種復(fù)雜的依賴注入。

源碼分享:https://github.com/kevinyan815/php_reflection_dependency_injection_demo/blob/master/reflection.php

您可能感興趣的文章:
  • PHP經(jīng)典設(shè)計(jì)模式之依賴注入定義與用法詳解
  • PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解
  • PHP依賴注入(DI)和控制反轉(zhuǎn)(IoC)詳解
  • php中Ioc(控制反轉(zhuǎn))和Di(依賴注入)
  • PHP控制反轉(zhuǎn)(IOC)和依賴注入(DI)
  • 對PHP依賴注入的理解實(shí)例分析
  • 理解php依賴注入和控制反轉(zhuǎn)
  • 詳解PHP設(shè)計(jì)模式之依賴注入模式

標(biāo)簽:株洲 南昌 白酒營銷 濱州 曲靖 太原 南京 興安盟

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺析PHP類的反射來實(shí)現(xiàn)依賴注入過程》,本文關(guān)鍵詞  淺析,PHP,類,的,反射,來,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺析PHP類的反射來實(shí)現(xiàn)依賴注入過程》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺析PHP類的反射來實(shí)現(xiàn)依賴注入過程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久精品免视看国产明星 | 一级女性大黄生活片免费| 精品国产一区二区三区精东影业| 精品久久久久久中文字幕一区| 999久久66久6只有精品| 黄视频网站在线免费观看| 香蕉视频久久| 日本在线不卡视频| 日本伦理网站| 精品视频在线观看免费| 韩国毛片基地| 国产福利免费观看| 91麻豆精品国产片在线观看| 高清一级做a爱过程不卡视频| 亚洲第一视频在线播放| 国产精品12| 欧美大片a一级毛片视频| 国产成a人片在线观看视频| 青青久久精品国产免费看| 欧美一区二区三区性| 欧美国产日韩久久久| 欧美日本免费| 精品国产一级毛片| 999精品影视在线观看| 精品视频在线观看视频免费视频 | 一级毛片视频免费| 久久99中文字幕| 日韩女人做爰大片| 精品视频免费观看| 欧美大片a一级毛片视频| 亚洲精品中文一区不卡| 亚洲女初尝黑人巨高清在线观看| 精品久久久久久免费影院| 精品视频在线观看视频免费视频 | 青青久久精品国产免费看| 精品视频在线观看免费| 精品国产一区二区三区免费 | 韩国三级视频网站| 欧美一级视| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩综合| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美激情一区二区三区视频| 韩国三级视频网站| 国产成a人片在线观看视频| 免费国产一级特黄aa大片在线| 九九久久99| 午夜欧美成人香蕉剧场| 欧美日本国产| 久久国产精品只做精品| 天天做人人爱夜夜爽2020毛片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美国产日韩在线| 四虎久久影院| 日本在线www| 欧美激情影院| 国产成人欧美一区二区三区的| 九九久久99| 国产成人精品一区二区视频| 97视频免费在线观看| 国产伦精品一区三区视频| 欧美18性精品| 欧美国产日韩在线| 国产成人啪精品视频免费软件| 久久久久久久免费视频| 午夜久久网| 日本在线www| 免费毛片播放| 免费一级生活片| 国产精品自拍在线| 国产国产人免费视频成69堂| 一级女性大黄生活片免费| 国产a免费观看| 午夜家庭影院| 国产91丝袜高跟系列| 深夜做爰性大片中文| 国产一区二区精品久久91| 四虎久久影院| 国产成a人片在线观看视频| 高清一级做a爱过程不卡视频| 一级女性全黄生活片免费| 91麻豆精品国产综合久久久| 天天做人人爱夜夜爽2020毛片| 精品在线观看一区| 午夜久久网| 欧美爱色| 精品视频在线观看视频免费视频 | 日韩综合| 午夜久久网| 日韩在线观看视频网站| 二级片在线观看| 欧美1区| 国产高清视频免费观看| 午夜激情视频在线观看| 国产成a人片在线观看视频| 欧美日本免费| 91麻豆国产福利精品| 亚洲第一视频在线播放| 91麻豆精品国产自产在线 | 91麻豆tv| 九九干| 香蕉视频一级| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 色综合久久天天综合绕观看| 美女免费毛片| 日韩女人做爰大片| 欧美18性精品| 国产成人啪精品视频免费软件| 午夜激情视频在线观看| 国产原创中文字幕| 国产国语在线播放视频| 成人免费网站视频ww| 美女免费精品高清毛片在线视| 亚洲不卡一区二区三区在线| 一级女性大黄生活片免费| 一级女性全黄生活片免费| 尤物视频网站在线观看| 中文字幕一区二区三区 精品| 久久99爰这里有精品国产| 一级女性全黄生活片免费| 91麻豆国产福利精品| 亚洲精品中文一区不卡| 精品国产一区二区三区久久久狼| 高清一级做a爱过程不卡视频| 久久精品成人一区二区三区| 国产成人欧美一区二区三区的| 国产一级生活片| 亚飞与亚基在线观看| 麻豆网站在线看| 香蕉视频久久| 精品视频在线观看免费| 国产91素人搭讪系列天堂| 午夜在线观看视频免费 成人| 午夜家庭影院| 一级毛片看真人在线视频| 韩国三级香港三级日本三级| 午夜激情视频在线观看| 天天色色网| 韩国毛片基地| 深夜做爰性大片中文| 亚飞与亚基在线观看| 国产91精品露脸国语对白| 国产麻豆精品视频| 午夜激情视频在线观看| 日韩综合| 国产成人精品综合在线| 美女免费精品高清毛片在线视| 欧美激情一区二区三区视频| 尤物视频网站在线观看| 久久精品成人一区二区三区| 国产高清在线精品一区二区| 韩国三级视频网站| 国产精品自拍在线| 黄视频网站免费观看| 美女免费毛片| 免费一级生活片| 日韩av成人| 日日夜夜婷婷| 国产精品1024永久免费视频| 成人免费观看视频| 一级女性全黄生活片免费| 亚洲不卡一区二区三区在线| 国产视频一区二区在线播放| 黄色福利片| 亚洲 欧美 成人日韩| 天天做日日干| 一级女性大黄生活片免费| 精品视频在线观看视频免费视频 | 久久久久久久免费视频| 韩国三级视频网站| 可以在线看黄的网站| 欧美国产日韩久久久| 日本在线www| 国产一区免费在线观看| 国产高清视频免费观看| 黄视频网站在线观看| 成人av在线播放| 国产福利免费观看| 四虎久久影院| 深夜做爰性大片中文| 精品在线观看一区| 欧美一级视频免费观看| 91麻豆精品国产自产在线 | 91麻豆爱豆果冻天美星空| 麻豆午夜视频| 免费的黄色小视频| 欧美一级视| 日韩av成人| 精品视频免费在线| 国产成人精品一区二区视频| 日本在线不卡视频| 日韩免费在线视频| 久久99爰这里有精品国产| 国产视频久久久| 国产视频一区二区在线播放| 成人免费观看的视频黄页| 欧美α片无限看在线观看免费| 精品视频在线观看免费| 免费毛片播放| 久久精品成人一区二区三区|