2012-01-21 93 views
1

我試圖實現以下目標:摘要Singleton模式類

使用這種一般單例類:

abstract class Singleton { 

    private static $instance = null; 

    public static function self() 
    { 
     if(self::$instance == null) 
     { 
     $c = __CLASS__; 
     self::$instance = new $c; 
     } 

     return self::$instance; 
    } 
} 

我很想能夠創建辛格爾頓具體類,如:

class Registry extends Singleton { 
    private function __construct() {} 
    ... 
} 

,然後用它們爲:

Registry::self()->myAwesomePonyRelatedMethod(); 

但遺忘__CLASS__旨在作爲Singleton所以發生一個致命的錯誤,關於PHP不能實例化一個抽象類。但事實是,我希望Registry(例如)被實例化。

所以我嘗試get_class($this),但是作爲一個靜態類,Singleton沒有$ this。

我能做些什麼才能使它工作?

+0

您運行的是哪個版本的PHP? – 2012-01-21 15:51:21

+0

@Phoenix 5.3.0+ – Shoe

+4

[Singletons is Evil](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) –

回答

5

從我的幻燈片Singletons in PHP - Why they are bad and how you can eliminate them from your applications刪節代碼:

abstract class Singleton 
{ 
    public static function getInstance() 
    { 
     return isset(static::$instance) 
      ? static::$instance 
      : static::$instance = new static(); 
    } 

    final private function __construct() 
    { 
     static::init(); 
    } 

    final public function __clone() { 
     throw new Exception('Not Allowed'); 
    } 

    final public function __wakeup() { 
     throw new Exception('Not Allowed'); 
    } 

    protected function init() 
    {} 
} 

然後,你可以做

class A extends Singleton 
{ 
    protected static $instance; 
} 

如果你需要做額外的安裝邏輯覆蓋init在擴展的類。

另請參閱Is there a use-case for singletons with database access in PHP?

+1

+1對於提及的幻燈片:) – Pelshoff

+2

@戈登,你剛剛摧毀了我的項目想法。多殘忍!我之前喜歡辛格爾頓,現在我讀了關於它們的所有這些不好的事情:(所以基本上爲了避免它們,我應該使用依賴注入模式? – Shoe

+1

@JeffPigarelli如果我不認爲這是主要的WIN,我會說對不起);是。依賴注入是要走的路。創作者圖和協作者圖的分離。見http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/ – Gordon