2016-08-08 60 views
0

我有一个容易的(我认为)。对象阵列的内爆

我有一个Silex应用程序...我创建了一个服务services.yml文件,我的服务与他们的参数。 coruse的,参数可以是另一个类的实例:

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

所以,在我的init程序,我有这样的一段代码:

$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); 
    } 

此代码给我的错误:

可捕捉致命错误:类App \ Lib \ Parser \ JsonParser的对象无法转换为线252上的/app/src/Application.php中的字符串

我的目标是让$ this [$ name] = new $类名($日是,$ args [0],$ args [1] ....),但我不能使用implode函数。

任何想法???

预先感谢您!

M.

回答

1

我建议使用ReflectionClass来实例$className

后您收集所有的$args不使用implode方法,因为它无法通过正确的参数传递给类的构造函数。

所以,你必须$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中使用的,我认为这是php中用于从args创建类实例的唯一wawy。 – Whiteulver