2014-11-05 77 views
1

最近我已经开始使用Pimple(与Silex一起)。根据Pimple的使用方式,它可以是服务定位器或依赖注入容器。 我知道应该避免使用服务定位符模式的原因。然而,似乎困扰着我的一件事是创建依赖实例的时刻。PHP延迟加载疙瘩依赖注入容器?

在依赖注入的情况下,创建所需的类的实例,并传递给构造函数:

class Foo{ 
    public $depend1; 
    public $depend2; 

    public function __construct($depend1, $depend2) { 
     $this->depend1=$depend1; 
     $this->depend2=$depend2; 
    } 

    public function task1() { 
     return $this->depend1->run(); 
    } 

    public function task2() { 
     return $this->depend2->run(); 
    } 
} 

在情况下,我们的容器本身传递给类的构造函数,依赖情况下不需要直到需要时才创建。

class Foo{ 
    public $app; 

    public function __construct(\Silex\Application $app) { 
     $this->app=$app; 
    } 

    public function task1() { 
     return $app['depend1']->run(); 
    } 

    public function task2() { 
     return $app['depend2']->run(); 
    } 
} 

其结果是,即使我们只打算呼吁Foo类的两种方法之一,在第一个例子还是既依赖实例将被创建。这段代码是一个非常简单的例子,但我认为如果更复杂的类具有更多的依赖性结构,问题将会增加。我注意到一些其他的依赖注入容器使用代理类,但无法找到这个库的任何东西。有没有更好的替代方案延迟加载Pimple的依赖关系?

回答

2

在大多数情况下,这不是问题。如果初始化您的依赖关系成为实际的性能问题,您应该将服务分成两个单独的服务,或者创建一个代理,以便在首次调用时加载依赖关系。

有一个PHP库,提供自动代理生成,名为ProxyManager。在不知道你的要求的情况下,我的第一个猜测是,这对你来说可能是矫枉过正的。除非您确定存在可以通过此方式解决的实际性能瓶颈,否则不要担心。