2014-11-25 7 views
0

반향을 사용하여 클래스에 특정 부모 클래스가 있는지 테스트 한 다음 인스턴스를 반환합니다.동적으로 생성 된 객체에 의존성 주입

if(class_exists($classname)){ 
      $cmd_class = new \ReflectionClass($classname); 
      if($cmd_class->isSubClassOf(self::$base_cmd)){ 
       // var_dump($cmd_class);exit; 
       return $cmd_class->newInstance(); 
      } 
     } 

나는 이러한 인스턴스 객체 단위 테스트 할 수 있도록하려면하지만이 경우에는 의존성 주입을 사용하는 어떤 방법이 있는지 모르겠어요. 내 생각은 공장을 사용하여 종속성을 얻는 것이 었습니다. 공장 패턴이 최선의 선택입니까? 클래스가 가지고 종속성 여전히 모르는 것이 방법을 사용하여

답변

1

My thought was to use factories to get dependencies

. 한 단계 더 나아가 리플렉션 API와의 종속성을 해결하는 것이 좋습니다.

실제로 힌트 생성자 인수를 입력 할 수 있으며 Reflection API는 유형 힌트를 완전히 읽을 수 있습니다. 물론

<?php 

class Email { 

    public function send() 
    { 
     echo "Sending E-Mail"; 
    } 

} 

class ClassWithDependency { 

    protected $email; 

    public function __construct(Email $email) 
    { 
     $this->email = $email; 
    } 

    public function sendEmail() 
    { 
     $this->email->send(); 
    } 

} 


$class = new \ReflectionClass('ClassWithDependency'); 
// Let's get all the constructor parameters 
$reflectionParameters = $class->getConstructor()->getParameters(); 

$dependencies = []; 
foreach($reflectionParameters AS $param) 
{ 
    // We instantiate the dependent class 
    // and push it to the $dependencies array 
    $dependencies[] = $param->getClass()->newInstance(); 
} 

// The last step is to construct our base object 
// and pass in the dependencies array 
$instance = $class->newInstanceArgs($dependencies); 
$instance->sendEmail(); //Output: Sending E-Mail 

당신이 오류 (예를 들어 생성자의 인자에 대한 Typehint가없는 경우) 직접 검사를 수행해야합니다

여기에 매우 기본적인 예이다. 또한이 예제는 중첩 된 종속성을 처리하지 않습니다. 그러나 기본적인 아이디어를 얻어야합니다.

이 단계를 한층 더 생각하면 특정 유형 힌트를 삽입 할 인스턴스를 구성하는 작은 DI 컨테이너를 어셈블 할 수도 있습니다.