2011-03-06 93 views
3

最近,我看到了我的一個同事實例化一個構造他的課,所以我就開始做同樣的,就像這樣:我應該在構造函數中實例化其他類嗎?

class FooBar{ 
private $model1; 
private $model2; 
    public function __construct() { 
     $this->model1=new Model1(); 
      $this->model2=new Model2(); 
    } 
} 

而現在我開始想,如果可能實例化模型隨處可見,其中他們需要可能會更好?

例如,功能foo()需要模型1,功能bar()需要模型2,但現在兩個模型都已加載。

所以,問題:這是實例其他類的正確方法?或者我應該在需要它們的時候實例化它們?

+0

這取決於上下文。如果您不止一次調用方法,您是否想每次都實例化一個新模型?如果你想,是否真的有必要? – 2011-03-06 13:42:23

回答

2

嗯,一如既往,沒有一個放之四海而皆準的答案。

大部分時間,類FooBar聚集$model1$model2,因爲它需要它們來實現其功能。在這種情況下,除非這些變量中有對象,否則FooBar可以做的不多,所以在構造函數中創建它們是正確的。

有時不需要的聚集體對象來執行類FooBar的功能的很大一部分,並且該對象的結構是昂貴的操作。在這種情況下,是有意義的只有像下面的代碼構造它的需求:

class FooBar { 
    private $model1; 
    private $model2; 

    public function Frob() { 
     $model = $this->getModel1(); 
     $model->frob(); 
    } 

    private function getModel1() { 
     if ($this->model1 === null) { 
      $this->model1 = new Model1; 
     } 

     return $this->model1; 
    } 
} 

然而,這只是有時。如果類FooBar需要$model1在其業務和$model2另一半的一半,這可能表明FooBar是從的情況下,患的是「讓我們拋開一切一個類的內部」,並應分成兩類來代替。

+0

如果一個類已經被實例化,那麼所有這些實例化和測試都可以在一個單獨的類中完成嗎?像一個全局類實例化類?聽起來有點變態,但它會使實例更具可重用性。 – 2011-03-06 13:55:11

+0

@Janis:測試,沒有。實例化,是的。您可以爲'FooBar'構造函數提供回調函數,該函數將在調用時返回適當的模型,也可以一直使用依賴注入容器(http://www.google.com/search?q=+php+dependency + +注入容器)。 – Jon 2011-03-06 13:58:28

+0

既然您的答案包含了對我有用的更多信息,我選擇這個作爲接受的答案。 – 2011-03-07 07:16:53

2

我想看到這些依賴注入的構造函數的參數。

+0

是的,如果您需要創建其他類的實例,則注入一個可以創建它們的工廠。應提供依賴關係,而不是實例化的,以便您可以用模擬實例替換它們以進行測試。 – tvanfosson 2011-03-06 13:46:39

1

實際上應該在需要時加載它們,否則每次需要進行微不足道的操作時,不需要的一大堆模型(可能會有自己的構造函數加載更多模型!)會彈出到內存中。

,除非你確定你將使用它們(如模型所需定位和這樣)

1

這不是精確的科學,你應該遵循怎樣組織自己的直覺,不要創建新模型代碼。

如果這種方法得到不可維護的,或者你想單元測試,依賴注入可能會出手相救。

但是,如果你正在做簡單的腳本和開發時間是一個重要因素,你現在正在做的方式是足夠的。

相關問題