2016-08-08 5 views
0

나는 쉬운 것을 가지고있다 (나는 생각한다).객체 배열의 Implode

나는 Silex 응용 프로그램을 가지고 있습니다 ... 나는 그들의 서비스와 함께 services.yml 파일을 만들었습니다.

:

$services = $this['config']['services']; 

    foreach ($services as $name => $service) { 
     $className = $service['class']; 

     $args = array_map(function ($arg) { 
      if(class_exists($arg)){ 
       return new $arg; 
      } else { 
       return $arg; 
      } 
     }, $service['arguments']); 
     $args = implode(',', $args); 

     $this[$name] = new $className($this, $args); 
    } 

이 코드는 나에게 오류를 제공합니다

services: 
    Service: 
     class: App\Services\xxxxxService 
     arguments: 
     - App\Lib\Parser\JsonParser 
     - xxxxxx 

그래서, 내 초기화 응용 프로그램에서, 나는이 코드 조각이 : coruse 중 인수는 다른 클래스의 인스턴스가 될 수 있습니다 잡을 수있는 치명적인 오류 : App \ Lib \ Parser \ JsonParser 클래스의 객체를 252 행의 /app/src/Application.php에서 문자열로 변환 할 수 없습니다.

내 목표는 $ this [$ name] = new $ className ($ th $ args [0], $ args [1] ....),하지만 함몰 함수를 사용할 수 없습니다.

어떤 아이디어 ???

미리 감사드립니다.

M.

답변

1

내가 인스턴스화 ReflectionClass를 사용하는 것이 좋습니다 당신의 수집 후 $className

모든 것이 클래스 생성자에 제대로 인수를 전달할 수 없습니다로 $argsimplode 방법을 사용하지 마십시오.

그래서 당신은 $argsarray

array_unshift($args, $this); # Prepend $this in args 
$refl = new ReflectionClass($className); 
$this[$name] = $refl->newInstanceArgs($args); #Instatiate $className with appropriate args. 
+0

YESSS 있습니다! ... 반사가 트릭을! 너 +1해라! Reflection이 메모리 사용량 측면에서 너무 비싸다고 생각합니까? 내 코드를 보면, 내가이 일을 제대로 수행하고 있다고 생각합니까? .... 나는 Silex \ Application의 응용 프로그램 래퍼를 가지고 있으며 이것을 실행하기 전에 모든 제어기, 매개 변수 및 서비스를 $ app에 시작합니다. 즉, Pimple의 인스턴스입니다. 내 응용 프로그램에서 이제 $ app [ 'myService']가 있고 어디서나 재사용 할 수 있습니다. – Mauro

+0

DependencyInjection 도구를 작성하려고합니다. 비록 많은 것들이 있지만, 당신이 그 과정에서 많은 것들을 배울 수 있기 때문에 자신 만의 것을 만드는 것이 나쁘지 않습니다. 성능면에서는 느린 경우 응용 프로그램을 벤치마킹 한 다음 프로파일 링하는 것이 더 좋습니다. 프로파일 링에서 병목 현상이 어디 있는지 확인할 수 있습니다. ReflectionClass는 또한 Symfony DI에서 사용되며, args에서 클래스 인스턴스를 만드는 유일한 wawy라고 생각합니다. – Whiteulver