2014-11-05 50 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。在不知道你的要求的情況下,我的第一個猜測是,這對你來說可能是矯枉過正的。除非您確定存在可以通過此方式解決的實際性能瓶頸,否則不要擔心。