亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

淺析PHP類的反射來實現依賴注入過程

2024-05-05 00:02:17
字體:
來源:轉載
供稿:網友

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

為了更好地理解,我們通過一個例子來看類的反射,以及如何實現依賴注入。

下面這個類代表了坐標系里的一個點,有兩個屬性橫坐標x和縱坐標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;  }}

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

class Circle{  /**   * @var int   */  public $radius;//半徑  /**   * @var Point   */  public $center;//圓心點  const PI = 3.14;  public function __construct(Point $point, $radius = 1)  {    $this->center = $point;    $this->radius = $radius;  }    //打印圓點的坐標  public function printCenter()  {    printf('center coordinate is (%d, %d)', $this->center->x, $this->center->y);  }  //計算圓形的面積  public function area()  {    return 3.14 * pow($this->radius, 2);  }}

ReflectionClass

下面我們通過反射來對Circle這個類進行反向工程。

把Circle類的名字傳遞給reflectionClass來實例化一個ReflectionClass類的對象。

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

反射出類的常量

$reflectionClass->getConstants();

返回一個由常量名稱和值構成的關聯數組

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

通過反射獲取屬性

$reflectionClass->getProperties();

返回一個由ReflectionProperty對象構成的數組

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對象構成的數組

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()來單獨獲取類的構造方法,其返回值為一個ReflectionMethod對象。

$constructor = $reflectionClass->getConstructor();

反射出方法的參數

$parameters = $constructor->getParameters();

其返回值為ReflectionParameter對象構成的數組。

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

依賴注入

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

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

定義好make方法后我們通過它來幫我們實例化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)*/

通過上面這個實例我簡單描述了一下如何利用PHP類的反射來實現依賴注入,Laravel的依賴注入也是通過這個思路來實現的,只不過設計的更精密大量地利用了閉包回調來應對各種復雜的依賴注入。

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


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久av免费| 日韩欧美在线视频观看| 国产欧美最新羞羞视频在线观看| 久久久女人电视剧免费播放下载| 欧美第一黄网免费网站| 欧美一级大片在线免费观看| 国产剧情久久久久久| 色av吧综合网| 久久黄色av网站| 97香蕉久久夜色精品国产| 国产精自产拍久久久久久蜜| 国产主播欧美精品| 国产视频丨精品|在线观看| 成人高h视频在线| 伊人成人开心激情综合网| 欧美精品电影免费在线观看| 久久久久久久91| 色青青草原桃花久久综合| 欧美一级黑人aaaaaaa做受| 日韩精品视频在线观看网址| 美女视频久久黄| 欧美疯狂性受xxxxx另类| 成人a视频在线观看| 欧美黑人一级爽快片淫片高清| 另类少妇人与禽zozz0性伦| 久久久久一本一区二区青青蜜月| 欧美亚洲视频一区二区| 国产精品国产自产拍高清av水多| 久久久久久久久久久成人| 91国内免费在线视频| 成人黄色免费在线观看| 国产精品三级美女白浆呻吟| 91免费的视频在线播放| 青青久久av北条麻妃黑人| 成人av在线亚洲| 国产精品视频最多的网站| 欧洲亚洲妇女av| 精品动漫一区二区| 91国偷自产一区二区三区的观看方式| 亚洲一区二区中文字幕| 久久综合久中文字幕青草| 欧美激情欧美狂野欧美精品| 日本高清不卡的在线| 日韩亚洲欧美中文高清在线| 国产视频精品在线| 亚洲国产成人在线播放| 91视频8mav| 久久国产精品久久久久久| 最近2019中文字幕在线高清| 亚洲第一区在线| 国产成人自拍视频在线观看| 中文字幕日韩欧美在线| 精品久久久久久久久久| 91在线视频成人| 国产精品一区二区久久| 久久久免费在线观看| 91亚洲国产成人精品性色| 国产成人精品久久二区二区| 日韩亚洲欧美中文高清在线| 亚洲视频日韩精品| 中文字幕在线国产精品| 中文字幕亚洲欧美在线| 国内精品久久久久久中文字幕| 日韩精品视频免费专区在线播放| 日韩成人网免费视频| 国产欧美日韩最新| 中文国产亚洲喷潮| 日韩av不卡电影| 国产在线拍偷自揄拍精品| 亚洲iv一区二区三区| 亚洲激情视频网站| 久久久久久久久久久av| 亚洲自拍另类欧美丝袜| 亚洲www在线| 中文字幕视频一区二区在线有码| 亚洲va男人天堂| 精品国产一区二区三区四区在线观看| 国产日韩欧美夫妻视频在线观看| 国产精品偷伦一区二区| 亚洲丝袜一区在线| 国产精品视频中文字幕91| 欧美电影在线观看完整版| 久热在线中文字幕色999舞| 国产日韩欧美在线看| 成人a在线视频| 日韩av免费看网站| 久久夜色精品国产欧美乱| 久久久成人的性感天堂| 91福利视频在线观看| 国产精品96久久久久久又黄又硬| 亚洲一区中文字幕在线观看| 国产亚洲欧美日韩美女| 久久久久久18| 欧美大片在线免费观看| 亚洲成人久久网| 成人av番号网| 海角国产乱辈乱精品视频| 一本大道亚洲视频| 久久久国产精品一区| 美女视频黄免费的亚洲男人天堂| 亚洲爱爱爱爱爱| 色综合导航网站| 国产91色在线|免| 国产精品久久久久久亚洲调教| 美女扒开尿口让男人操亚洲视频网站| 成人乱人伦精品视频在线观看| 91影院在线免费观看视频| 日韩精品在线私人| 久久免费视频观看| 精品国产一区二区三区四区在线观看| 色婷婷**av毛片一区| 97视频在线观看免费| 国产精品丝袜久久久久久高清| 国产视频福利一区| 国产精品旅馆在线| 国产精品av电影| 日本韩国在线不卡| 欧美日韩激情视频| 亚洲free性xxxx护士白浆| 欧美视频13p| 午夜精品久久久久久久99热| 欧美性受xxx| 欧美激情在线观看| 91九色蝌蚪国产| 日韩美女免费视频| 久久中国妇女中文字幕| 国产亚洲精品91在线| 国产精品视频久久| 欧美久久久精品| 成人精品在线观看| 亚洲精品美女网站| 亚洲少妇中文在线| 91精品国产九九九久久久亚洲| 亚洲欧洲偷拍精品| 久久精彩免费视频| 亚洲综合中文字幕68页| 98精品国产自产在线观看| 成人黄色免费看| 欧美一级电影在线| 亚洲情综合五月天| 久久国产一区二区三区| 色午夜这里只有精品| 精品亚洲va在线va天堂资源站| 日韩精品www| 国产成人在线一区二区| 欧美另类精品xxxx孕妇| 国内外成人免费激情在线视频网站| 久久久久久久久网站| 亚洲天堂一区二区三区| 欧美电影院免费观看| 亚洲国产一区二区三区四区| 成人在线观看视频网站| 亚洲精品网址在线观看| 另类色图亚洲色图| 成人精品久久av网站| 国产精品吹潮在线观看| 日韩精品在线视频观看| 欧美在线视频网| 欧美精品第一页在线播放| 欧美在线观看一区二区三区| 北条麻妃一区二区三区中文字幕| 亚洲影影院av| 久久人人爽人人爽人人片亚洲| 亚洲精品视频在线观看视频|