>  기사  >  백엔드 개발  >  PHP에서 리플렉션 메커니즘을 기반으로 자동 종속성 주입을 구현하는 방법

PHP에서 리플렉션 메커니즘을 기반으로 자동 종속성 주입을 구현하는 방법

墨辰丷
墨辰丷원래의
2018-05-17 09:33:562666검색

이 기사에서는 주로 리플렉션 메커니즘을 기반으로 PHP의 자동 종속성 주입 방법을 소개합니다. 리플렉션을 사용하여 자동 종속성 주입을 구현하는 PHP의 단계, 원리 및 관련 작동 기술을 예제 형식으로 분석합니다.

이 기사의 예제는 PHP가 리플렉션 메커니즘을 기반으로 자동 종속성 주입을 구현하는 방법입니다. 참고를 위해 자세한 내용을 공유합니다.

의존성 주입은 제어 역전이라고도 합니다. 프레임워크를 사용해 본 사람이라면 누구나 익숙할 것입니다. 많은 사람들이 이름을 보고 매우 고급스러운 제품이라고 생각하고 겁을 먹습니다. 오늘은 시간을 내어 조사를 하고 그 미스터리를 풀어봤습니다. 더 이상 고민하지 않고 바로 코드로 넘어가겠습니다.

/**
*
* 工具类,使用该类来实现自动依赖注入。
*
*/
class Ioc {
  // 获得类的对象实例
  public static function getInstance($className) {
    $paramArr = self::getMethodParams($className);
    return (new ReflectionClass($className))->newInstanceArgs($paramArr);
  }
  /**
   * 执行类的方法
   * @param [type] $className [类名]
   * @param [type] $methodName [方法名称]
   * @param [type] $params   [额外的参数]
   * @return [type]       [description]
   */
  public static function make($className, $methodName, $params = []) {
    // 获取类的实例
    $instance = self::getInstance($className);
    // 获取该方法所需要依赖注入的参数
    $paramArr = self::getMethodParams($className, $methodName);
    return $instance->{$methodName}(...array_merge($paramArr, $params));
  }
  /**
   * 获得类的方法参数,只获得有类型的参数
   * @param [type] $className  [description]
   * @param [type] $methodsName [description]
   * @return [type]       [description]
   */
  protected static function getMethodParams($className, $methodsName = '__construct') {
    // 通过反射获得该类
    $class = new ReflectionClass($className);
    $paramArr = []; // 记录参数,和参数类型
    // 判断该类是否有构造函数
    if ($class->hasMethod($methodsName)) {
      // 获得构造函数
      $construct = $class->getMethod($methodsName);
      // 判断构造函数是否有参数
      $params = $construct->getParameters();
      if (count($params) > 0) {
        // 判断参数类型
        foreach ($params as $key => $param) {
          if ($paramClass = $param->getClass()) {
            // 获得参数类型名称
            $paramClassName = $paramClass->getName();
            // 获得参数类型
            $args = self::getMethodParams($paramClassName);
            $paramArr[] = (new ReflectionClass($paramClass->getName()))->newInstanceArgs($args);
          }
        }
      }
    }
    return $paramArr;
  }
}

위 코드는 PHP의 리플렉션 함수를 사용하여 컨테이너 클래스를 만들고 이 클래스를 사용하여 다른 클래스의 종속성 주입 기능을 구현합니다. 위의 의존성 주입은 생성자의 의존성 주입과 메소드의 의존성 주입 두 가지로 나누어진다. 테스트를 위해 다음 세 가지 클래스를 사용합니다. constructors의 종속성 주입 생성자의 종속성 주입은 위의 두 예에서 객체를 만들거나 호출 할 때 볼 수 있습니다. 메소드를 사용하면 이 클래스나 메소드가 어느 클래스에 의존하는지 알 필요가 없습니다. 리플렉션 메커니즘을 사용하면 필요한 클래스를 쉽게 자동으로 주입할 수 있습니다.

관련 추천:

PHP 반사 메커니즘에 대한 자세한 설명

PHP 반사 메커니즘 예제에 대한 간략한 설명 및 자세한 설명

PHP 반사 메커니즘의 원리는 무엇인가요? 반사 메커니즘의 기능에 대한 자세한 설명


위 내용은 PHP에서 리플렉션 메커니즘을 기반으로 자동 종속성 주입을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.