2011-04-15 97 views
0

我正在爲PHP應用程序編寫一些實用程序類,其中很多將是單例。發現自己一遍又一遍地重寫相同的代碼,並決定創建一個抽象基類Singleton並對其進行子類化。只是想確保我已經做到了這一點!關於單例模式的澄清

abstract class Singleton 
{ 
    private static $instance = NULL; 

    public static final function getInstance() 
    { 
     if(self::$instance == NULL) 
      self::$instance = instantiate(); 

     return self::$instance; 
    } 

    protected abstract static function instantiate(); 
} 

class LogHelper extends Singleton 
{ 
    protected static final function instantiate() 
    { 
     return new LogHelper(); 
    } 
} 

現在,如果我已經正確這個問題,我可以調用從任何地方LogHelper $LOGGER = LogHelper::getInstance()在我的代碼庫,並獲得參照相同的實例每一次,是嗎?

+0

這與Ruby提供的mixin類似。我也會遵循@ jesse的建議 – Wes 2011-04-15 21:20:44

+0

[爲什麼Singletons在PHP中沒有用處](http://gooh.posterous.com/singletons-in-php) – Gordon 2011-04-15 22:07:32

回答

2

您可能需要將您的getInstance()方法定義爲靜態,以便您可以在不必實例化類的情況下訪問它們。然後,你會使用這個:

$objSingleton = LogHelper::getInstance(); 

而且,你可能會想定義私有構造:

private function __construct() { } 
+0

謝謝,我一直在尋找這個在PHP一段時間 – rekaszeru 2011-04-15 21:20:06

1

雖然單身看起來像最初的理想解決方案,他們不是。瞭解註冊和注入注入;當你開始單元測試時,他們會讓你的生活更輕鬆。