婷婷综合国产,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
    一区二区中文字幕在线| 亚洲国产wwwccc36天堂| hitomi一区二区三区精品| 色视频一区二区| av一本久道久久综合久久鬼色| 91美女在线看| 亚洲欧洲日韩女同| 亚洲一级电影视频| 成人性视频免费网站| 97aⅴ精品视频一二三区| 亚洲一区二区三区中文字幕 | 日本不卡视频在线| 国产美女视频一区| 色婷婷国产精品| 日韩一区二区三区在线观看| 国产精品123| 日韩一区日韩二区| 黄色小说综合网站| 国产一区二区不卡在线| 欧美系列在线观看| 欧美激情中文不卡| 成人午夜又粗又硬又大| 日韩一级大片在线观看| 亚洲午夜在线视频| 国产美女一区二区| 成人一区在线看| 亚洲成人动漫在线免费观看| 91视频在线看| 国产精品国产三级国产普通话蜜臀 | 91精品午夜视频| 亚洲日韩欧美一区二区在线| 日本成人在线看| 精品制服美女丁香| 一区二区久久久久| 欧美在线免费观看视频| 国产精品高潮久久久久无| 激情成人综合网| 亚洲精品在线免费播放| 免费人成精品欧美精品| 欧美在线观看视频一区二区三区| 精品sm在线观看| 久久久影视传媒| 精品亚洲国内自在自线福利| 色狠狠综合天天综合综合| 亚洲精品老司机| 欧美色涩在线第一页| 精品成人在线观看| 在线视频一区二区三区| 肉肉av福利一精品导航| 制服丝袜亚洲色图| 成人听书哪个软件好| 亚洲成人tv网| 久久久国际精品| 欧美国产视频在线| 18成人在线观看| 亚洲丝袜美腿综合| 亚洲18女电影在线观看| 久久精品国产秦先生| 高清不卡在线观看| 欧美色爱综合网| 精品国产三级电影在线观看| 日韩小视频在线观看专区| 欧美日韩精品免费观看视频| 在线免费不卡视频| 亚洲精品一区二区在线观看| 国产亚洲精品7777| 一区二区高清视频在线观看| 久久精品国产亚洲a| 91麻豆国产精品久久| 欧美日韩免费电影| 国产精品不卡视频| 国产剧情在线观看一区二区| 在线国产亚洲欧美| 亚洲国产精品精华液ab| 蜜桃av一区二区在线观看| 国产成人免费高清| 在线不卡的av| 国产精品理论片| 三级精品在线观看| 丁香天五香天堂综合| 日韩精品在线一区| 久久国产精品区| 久久久精品天堂| 国产在线播放一区| 国产日韩欧美综合一区| 成人av在线电影| 国产日产欧美一区| 国产精品白丝jk黑袜喷水| 欧美成人伊人久久综合网| 亚洲在线成人精品| 在线观看日韩高清av| 一区二区三区中文字幕电影| 99麻豆久久久国产精品免费优播| 国产调教视频一区| 99亚偷拍自图区亚洲| 亚洲欧洲综合另类| 欧美精品久久久久久久久老牛影院| 亚洲激情六月丁香| 国产亚洲美州欧州综合国| 99国产精品久久久久| 日本欧美一区二区| 日韩精品成人一区二区三区| 国产福利精品导航| av资源网一区| 亚洲人成亚洲人成在线观看图片 | 在线观看免费亚洲| 裸体一区二区三区| 欧美成人猛片aaaaaaa| 99re热这里只有精品免费视频| 午夜精品久久久久久不卡8050| 欧美国产激情二区三区| 欧美色电影在线| 欧美无砖专区一中文字| 国产精品一区二区视频| 捆绑紧缚一区二区三区视频| 欧美性猛片aaaaaaa做受| 国产高清一区日本| 亚洲18影院在线观看| 一级中文字幕一区二区| 国产女主播一区| 中文字幕一区二区在线观看| 久久免费看少妇高潮| 欧美精品 国产精品| 欧洲精品中文字幕| 91亚洲永久精品| 国产不卡一区视频| 韩国成人福利片在线播放| 国产精品久久久久永久免费观看| 欧美国产亚洲另类动漫| 精品久久久影院| 欧美一区二区三区影视| 成人免费的视频| 色综合亚洲欧洲| 欧美午夜精品久久久久久孕妇| 欧美亚洲动漫另类| 6080yy午夜一二三区久久| 日韩精品中文字幕在线一区| 精品国产一区二区亚洲人成毛片| 2014亚洲片线观看视频免费| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美变态口味重另类| 日韩一区二区在线观看| xvideos.蜜桃一区二区| 婷婷开心久久网| 亚洲综合在线电影| 亚洲成a人v欧美综合天堂| 奇米精品一区二区三区在线观看 | 亚洲成人自拍偷拍| 国产精品自在欧美一区| 国产成人亚洲综合色影视| 一本大道av一区二区在线播放| 国产馆精品极品| 欧美va亚洲va在线观看蝴蝶网| xvideos.蜜桃一区二区| 午夜视频一区二区| 一本大道久久精品懂色aⅴ| 欧美一区二区三区在线电影| 91精品国产综合久久香蕉的特点 | 国产黄人亚洲片| 欧美大片国产精品| 免费成人av在线| 日韩一区二区三区精品视频| 天天综合网 天天综合色| 91麻豆精品国产无毒不卡在线观看| 亚洲欧美日韩在线| 欧美在线一区二区| 亚洲一区二区三区视频在线播放| av电影一区二区| 亚洲国产一区二区三区| 欧美一区欧美二区| 日韩成人精品视频| 国产精品久久777777| 色综合夜色一区| 午夜久久福利影院| 亚洲韩国精品一区| 色综合久久久久综合体桃花网| 亚洲丝袜精品丝袜在线| 欧美日韩国产高清一区| 国产又粗又猛又爽又黄91精品| 中文字幕欧美日本乱码一线二线| 成人午夜视频在线| 六月丁香婷婷久久| 亚洲免费观看在线观看| 日韩美一区二区三区| 欧美精品v国产精品v日韩精品 | 中文字幕精品一区二区精品绿巨人| 成人app网站| 国产在线视频不卡二| 亚洲综合在线电影| 欧美精品一区二区在线播放| 成人午夜激情片| 国产一区二区在线影院| 日本美女一区二区三区视频| 欧美一卡2卡三卡4卡5免费| 欧美日韩一卡二卡| 国产**成人网毛片九色 | 亚洲妇熟xx妇色黄| 亚洲精品自拍动漫在线| 国产丝袜欧美中文另类| 欧美精品一区二区三区久久久|