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

主頁(yè) > 知識(shí)庫(kù) > 淺析PHP類的反射來(lái)實(shí)現(xiàn)依賴注入過(guò)程

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

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

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

為了更好地理解,我們通過(guò)一個(gè)例子來(lái)看類的反射,以及如何實(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;
  }
}

接下來(lái)這個(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

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

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

$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)
}

通過(guò)反射獲取屬性

$reflectionClass->getProperties();

返回一個(gè)由ReflectionProperty對(duì)象構(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對(duì)象構(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"
 }
}

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

$constructor = $reflectionClass->getConstructor();

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

$parameters = $constructor->getParameters();

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

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

依賴注入

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

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

  return $dependencies;
}

定義好make方法后我們通過(guò)它來(lái)幫我們實(shí)例化Circle類的對(duì)象:

$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)*/

通過(guò)上面這個(gè)實(shí)例我簡(jiǎn)單描述了一下如何利用PHP類的反射來(lái)實(shí)現(xiàn)依賴注入,Laravel的依賴注入也是通過(guò)這個(gè)思路來(lái)實(shí)現(xiàn)的,只不過(guò)設(shè)計(jì)的更精密大量地利用了閉包回調(diào)來(lái)應(yīng)對(duì)各種復(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)
  • 對(duì)PHP依賴注入的理解實(shí)例分析
  • 理解php依賴注入和控制反轉(zhuǎn)
  • 詳解PHP設(shè)計(jì)模式之依賴注入模式

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺析PHP類的反射來(lái)實(shí)現(xiàn)依賴注入過(guò)程》,本文關(guān)鍵詞  淺析,PHP,類,的,反射,來(lái),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺析PHP類的反射來(lái)實(shí)現(xiàn)依賴注入過(guò)程》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺析PHP類的反射來(lái)實(shí)現(xiàn)依賴注入過(guò)程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美极品aⅴ影院| 国产亚洲一本大道中文在线| 亚洲午夜电影在线| 欧美在线视频不卡| 成人av动漫网站| www.日韩av| av网站免费线看精品| 91在线国产福利| 国产精品国产精品国产专区不蜜| 青草国产精品久久久久久| 亚洲国产成人私人影院tom | 欧美性色综合网| 日韩亚洲欧美综合| 国产精品不卡一区| 日韩伦理电影网| 美腿丝袜亚洲色图| 亚洲国产成人高清精品| 一区二区高清免费观看影视大全| 亚洲成人激情av| 日韩av不卡在线观看| 国产毛片精品国产一区二区三区| 成人精品国产免费网站| 激情六月婷婷综合| 91蜜桃免费观看视频| 成人av小说网| 日韩免费性生活视频播放| 欧美日韩高清在线播放| 欧美日韩国产综合视频在线观看| 欧美性欧美巨大黑白大战| 91精品国产麻豆| 日韩亚洲欧美成人一区| 久久美女高清视频| 一区二区三区久久| 亚洲国产一区视频| 日本欧美大码aⅴ在线播放| 懂色av一区二区在线播放| 欧美图区在线视频| 欧美一级在线观看| 2024国产精品| 婷婷开心激情综合| 色婷婷综合久久久中文一区二区| 久久综合999| 精品国产乱码久久久久久蜜臀| 欧美一区二区女人| 亚洲自拍偷拍图区| 91免费小视频| 国内精品国产成人国产三级粉色| 国产午夜精品一区二区三区四区| 国产成人在线观看免费网站| 欧美mv和日韩mv国产网站| 日韩高清不卡在线| 欧美一二三区精品| 欧美aaa在线| 一本到不卡精品视频在线观看| 久久久综合九色合综国产精品| 成人av电影在线播放| 制服丝袜成人动漫| 久久99精品久久只有精品| 日韩精品一区二区三区四区| 国模套图日韩精品一区二区| 国产中文一区二区三区| 中文字幕佐山爱一区二区免费| 99热99精品| 天堂va蜜桃一区二区三区| 精品日韩一区二区三区 | 久久婷婷综合激情| 日韩国产在线观看一区| 欧美三级视频在线| 欧美日韩亚洲高清一区二区| 亚洲三级久久久| 91在线视频免费观看| 美女一区二区久久| 国产精品妹子av| 日韩欧美美女一区二区三区| 国产在线精品视频| 亚洲一区二区三区视频在线| 欧美一区二区三区精品| 欧美色视频在线| 国产成人av影院| 亚洲色图欧美在线| 欧美日韩成人在线| 国产精品中文有码| 欧美xxxx在线观看| 成人精品免费看| 国产成人免费在线| 看片网站欧美日韩| 中文字幕亚洲在| 亚洲18色成人| 18成人在线观看| 在线视频一区二区三区| 欧美大肚乱孕交hd孕妇| 国产福利91精品一区二区三区| 狠狠色狠狠色综合| 国产亚洲欧美日韩俺去了| 国产在线精品一区二区不卡了| 中文子幕无线码一区tr| 亚洲欧洲国产专区| 欧美久久久久久蜜桃| 久久综合九色综合97_久久久| 在线视频国产一区| 老司机精品视频导航| 亚洲成人7777| 国产精品欧美经典| 国产拍揄自揄精品视频麻豆| 欧美日韩一区三区四区| 国产a久久麻豆| 久久精品99久久久| 精品理论电影在线观看| 亚洲bt欧美bt精品| 国产精品久久久久影院| 欧美日韩精品一区二区三区四区| 中文字幕不卡在线播放| 久久久久9999亚洲精品| 精品国产伦一区二区三区观看体验 | 亚洲精品日日夜夜| 亚洲精品免费一二三区| 亚洲香蕉伊在人在线观| 亚洲一卡二卡三卡四卡无卡久久| 国产精品网曝门| 青青草精品视频| 久久激情五月婷婷| 亚洲曰韩产成在线| 亚洲伦理在线免费看| 精品美女在线观看| 日本韩国欧美三级| gogo大胆日本视频一区| 成人av在线观| 国产成人免费视频精品含羞草妖精| 日韩va亚洲va欧美va久久| 一区二区三区久久| 日日夜夜一区二区| 亚洲图片你懂的| 伊人性伊人情综合网| 亚洲成人av一区二区三区| 色婷婷综合久久久久中文一区二区| 亚洲综合区在线| 欧洲日韩一区二区三区| 精品人在线二区三区| 26uuu国产日韩综合| 在线电影国产精品| 色噜噜狠狠成人网p站| 高清国产一区二区| 亚洲韩国精品一区| 亚洲超丰满肉感bbw| 手机精品视频在线观看| 日韩影院免费视频| 亚洲免费电影在线| 国产精品天天摸av网| 婷婷综合在线观看| 国产一区二区三区久久悠悠色av| 99精品黄色片免费大全| 9191久久久久久久久久久| 中文av一区特黄| 国产精品一区二区黑丝| 欧美体内she精高潮| 精品久久久久香蕉网| 蜜桃视频在线一区| 欧美久久一二区| 日韩va亚洲va欧美va久久| 国产精品久久一级| 精品视频999| 国产精品一区三区| 亚洲天堂成人网| 欧美tickle裸体挠脚心vk| 黄色精品一二区| 精品国产一二三| 波多野洁衣一区| 欧美视频在线一区| 亚洲风情在线资源站| 欧美自拍偷拍一区| 免费视频一区二区| 精品播放一区二区| 欧美韩国日本综合| 亚洲国产精品二十页| 在线欧美小视频| 韩国女主播一区二区三区| 亚洲男帅同性gay1069| 久久精品999| 欧美xxxxx牲另类人与| 国产一区三区三区| 不卡一二三区首页| 一区二区三区免费看视频| 91在线观看地址| 国产精品三级久久久久三级| 美女网站视频久久| 久久久99免费| 欧美日韩电影在线播放| 精品一区二区久久久| 精品久久久久一区| 久久99最新地址| 自拍偷拍国产亚洲| 不卡电影免费在线播放一区| 亚洲免费在线电影| 欧美国产精品劲爆| 91免费观看国产| 久久日韩精品一区二区五区| 国内精品视频666| 国产精品免费久久久久| 精品久久一二三区| 91精品国产91久久综合桃花|