2011-01-11 53 views
26

正如標題所說,我想從同一個類的靜態方法內創建一個類的實例。我已經想通了,我可以做這樣的事情:從靜態方法內創建類實例

class Foo{ 

public $val; 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 

} 

因此,讓我這樣做。

$obj = Foo::bar("some variable"); 

這很好。

所以現在的問題。有沒有一種更容易的方式來做到這一點,我不知道或達到相同結果的捷徑?以這種方式創建實例有什麼優點或缺點嗎?

謝謝。

+2

你是什麼理由做這種方式?爲什麼不使用普通的`$ obj = new Foo(「some variable」);`? – 2011-01-11 14:19:07

回答

68

他們這樣做的方式很好。還有一些其他的事情可以讓你的生活更輕鬆,你也可以做得更好。

  1. 請勿硬編碼類名。如果您使用的是5.3+,請使用關鍵字static。這樣,如果你擴展的類,新功能可以實例化一個還有:

    public static function bar($var) { 
        $obj = new static(); 
        $obj->var = $var; 
        return $obj; 
    } 
    

    然後你就可以在任何繼承類使用它,而無需重寫任何東西。

  2. 弄清楚,如果$var應通過構造函數傳遞,而不是施工後設置。如果對象依賴於它,則應該要求它。

    public function __construct($var) { 
        $this->var = $var; 
    } 
    

    這樣,你不能沒有設置變量實例化對象。

  3. 通過靜態方法強制類的實例化。如果你在那裏做任何你需要做的事情,那麼讓構造函數保護或者保密。這樣,有人不能繞過靜態方法。

    protected function __construct() {} 
    private function __construct() {} 
    

我希望幫助...

編輯:基於您上面的評論,這聽起來像你試圖執行Singleton Design Pattern。這裏有很多關於爲什麼它不是一個好主意和它可能做的壞事的信息。它也有用。

但還有一些其他模式可能對您有用,具體取決於您在做什麼。

  • 可以使用Factory Method如果你想創建一個使用相同的步驟,不同的對象。
  • 如果所有對象的起始位置相同,然後自定義,則可以使用Prototype Pattern
  • 如果創建對象特別昂貴,則可以使用Object Pool

但有一點需要考慮的是,在PHP中,對象的重量非常輕。不要試圖避免爲此開銷創建一個新對象。避免多次重複數據庫查詢或文件系統訪問等操作。但不要擔心撥打new Foo(),除非foo的構造函數特別沉重......

0

如果你只是創建一個對象,這不是非常有用。你可以調用一個構造函數。但是,如果你正在做的事情更復雜(比如你開始用某種單例模式,但沒有包括在這個例子中所有的細節),則:

這聽起來是正確的。如果你想阻止在默認的方式是這樣創建的對象:

$obj = new Foo("Some Variable"); 

您可以添加一個私有構造函數:

class Foo{ 

public $val; 

private __construct(){} 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 
} 

現在你強制人們使用您的靜態類。在函數中設置val的需求可能會消失,所以您甚至可以將value參數添加到您的私有構造函數中,但在您的項目中執行其他操作(假設您想要執行的操作,比如檢查某種單例模式) 'bar'功能

3

這看起來像一個簡單的工廠方法模式。

你有一個很好的優勢:假設你將來想要開始使用不同的實現(但它也是一樣的)。使用工廠,只需更改創建者方法,即可更改在複雜系統的許多位置創建的所有對象。請注意,如果您使用外部類(如下面的第一個鏈接所示),這會更容易。

保持現有狀態,您還可以繼承此類並覆蓋創建更復雜對象的方法。我不認爲這是你想在這裏實現的。

無論如何,這是很好的啓用測試驅動開發,抽象和許多其他好東西。

鏈接:

  1. Php patterns
  2. Factory method pattern on wikipedia
相關問題