2

我見過一些框架在php中實現DI。但是,由於PHP中的所有對象都是在單個請求的生命週期中創建和銷燬的,因此我不知道這會如何影響性能。依賴注入,PHP和性能問題

通常,您將在DI容器內定義一些對象。在php中,即使Controller不需要大多數這些對象,它們仍將被實例化。 另外,如果你在一個php文件中聲明你的DI依賴關係,你將加載所有引用的腳本。沒有DI,你只加載你需要的東西。

我看到一些框架允許惰性DI,所以這應該有助於不需要的實例化。也許分割DI也是解決第一個問題的方法。 那麼,DI會不會影響我的PHP應用程序性能,我應該如何去實現DI在PHP中,所以它不會發生?

+6

您的應用程序是否達到了額外開銷實際上導致問題的級別?或者,在你編寫第一個''標籤對之前,你是否擔心這一點?開始時不要微觀優化。 – 2012-04-12 18:31:13

+0

應用程序遭遇性能問題,部分大修正在重構應用程序,使其更加模塊化,引入了di fwks,doctrine 2等,以便更易於維護和優化。我不希望這會引入額外的性能損失。 – Dan 2012-04-12 18:45:20

+0

我不認爲決定DI方法/框架是一個微觀優化。這是一個應用基礎。 – webbiedave 2012-04-12 18:47:04

回答

0

你必須確定是否有問題,然後是什麼問題。

  • 您是否擁有需要大量資源和時間構建的依賴關係?

您可以使用延遲注入,是這樣的:

class Class1 { 
    /** 
    * @Inject(lazy=true) 
    * @var Class2 
    */ 
    private $class2; 

    public function doSomething() { 
     // The dependency is loaded NOW 
     return $this->class2->getSomethingElse(); 
    } 

(例如,從PHP-DI

  • 你有你的課太多的依賴?

你必須問自己,依賴注入是否真的是問題。如果你在哪裏創建新的實例(或使用單例)而不是使用DI,問題會消失嗎? (我不這麼認爲)

國際海事組織的性能考慮因素應該明確指出DI是問題。在應用程序中有很多部分可能會出錯。

0

通常,您將在DI容器中定義一些對象。在php中,即使Controller不需要大多數這些對象,它們仍將被實例化。

嗯,也有延遲初始化,所以這些對象只是輕量級的佔位符,並在需要的情況下的功能,在需要的時候,纔會創建大對象。

因此,DI會對我的php應用程序性能產生不利影響,我應該如何去實現在php中的DI,所以它不會發生?

每一行代碼都會影響應用程序的性能,所以無論你做什麼,都需要處理它。如果你真的關心性能,你應該先開始緩存應用程序的輸出,這樣除非需要,否則不需要加載任何代碼。