簡體   English   中英

用Pimple依賴注入容器進行PHP延遲加載?

[英]PHP Lazy loading with Pimple Dependency Injection Container?

最近,我開始使用Pimple(與Silex一起使用)。 根據使用Pimple的方式,它既可以是服務定位器,也可以是依賴注入容器。 我知道應避免使用服務定位器模式的原因。 然而,似乎困擾我的一件事是創建依賴實例的那一刻。

在進行依賴注入的情況下,將創建所需類的實例並將其傳遞給構造函數:

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延遲加載依賴項?

在大多數情況下,這不是問題。 如果初始化依賴關系成為實際的性能問題,則應該將服務拆分為兩個單獨的服務,或者創建一個代理來在第一次調用時延遲加載依賴關系。

有一個PHP庫提供了自動代理生成功能,稱為ProxyManager 在不知道您的要求的情況下,我的第一個猜測是,這可能對您來說太過分了。 在您確定存在可以解決此問題的實際性能瓶頸之前,請不必擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM