国产精品成人VA在线观看,亚洲日韩在线中文字幕综合,亚洲AV电影天堂男人的天堂,久久人人爽人人爽人人av东京热

News新聞

業(yè)界新聞動(dòng)態(tài)、技術(shù)前沿
Who are we?

您的位置:首頁(yè)      樂(lè)道系統(tǒng)FAQ      PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解

PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解

標(biāo)簽: 發(fā)布日期:2017-12-04 00:00:00 337

本文實(shí)例講述了PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法。分享給大家供大家參考,具體如下:

依賴注入又叫控制反轉(zhuǎn),使用過(guò)框架的人應(yīng)該都不陌生。很多人一看名字就覺(jué)得是非常高大上的東西,就對(duì)它望而卻步,今天抽空研究了下,解開(kāi)他它的神秘面紗。廢話不多說(shuō),直接上代碼;

/**
*
* 工具類,使用該類來(lái)實(shí)現(xiàn)自動(dòng)依賴注入。
*
*/
class Ioc {
  // 獲得類的對(duì)象實(shí)例
  public static function getInstance($className) {
    $paramArr = self::getMethodParams($className);
    return (new ReflectionClass($className))->newInstanceArgs($paramArr);
  }
  /**
   * 執(zhí)行類的方法
   * @param [type] $className [類名]
   * @param [type] $methodName [方法名稱]
   * @param [type] $params   [額外的參數(shù)]
   * @return [type]       [description]
   */
  public static function make($className, $methodName, $params = []) {
    // 獲取類的實(shí)例
    $instance = self::getInstance($className);
    // 獲取該方法所需要依賴注入的參數(shù)
    $paramArr = self::getMethodParams($className, $methodName);
    return $instance->{$methodName}(...array_merge($paramArr, $params));
  }
  /**
   * 獲得類的方法參數(shù),只獲得有類型的參數(shù)
   * @param [type] $className  [description]
   * @param [type] $methodsName [description]
   * @return [type]       [description]
   */
  protected static function getMethodParams($className, $methodsName = '__construct') {
    // 通過(guò)反射獲得該類
    $class = new ReflectionClass($className);
    $paramArr = []; // 記錄參數(shù),和參數(shù)類型
    // 判斷該類是否有構(gòu)造函數(shù)
    if ($class->hasMethod($methodsName)) {
      // 獲得構(gòu)造函數(shù)
      $construct = $class->getMethod($methodsName);
      // 判斷構(gòu)造函數(shù)是否有參數(shù)
      $params = $construct->getParameters();
      if (count($params) > 0) {
        // 判斷參數(shù)類型
        foreach ($params as $key => $param) {
          if ($paramClass = $param->getClass()) {
            // 獲得參數(shù)類型名稱
            $paramClassName = $paramClass->getName();
            // 獲得參數(shù)類型
            $args = self::getMethodParams($paramClassName);
            $paramArr[] = (new ReflectionClass($paramClass->getName()))->newInstanceArgs($args);
          }
        }
      }
    }
    return $paramArr;
  }
}