2010-05-17 40 views
3

我一直使用PHP的一個註冊表對象的Singleton類。由於所有的Singleton類我認爲主要的方法是這樣的:PHP靜態類和單例類之間的確切區別是什麼

class registry 
{ 
    public static function singleton() 
    { 
     if(!isset(self::$instance)) 
     { 
      self::$instance = new registry(); 
     } 
     return self::$instance; 
    } 

    public function doSomething() 
    { 
     echo 'something'; 
    } 
} 

所以每當我需要註冊表類的東西,我用這樣的功能:

registry::singleton()->doSomethine(); 

現在我不明白是什麼區別在於創建一個正常的靜態函數。如果我只是使用普通的靜態類,它會創建一個新的對象嗎?

class registry 
{ 
    public static function doSomething() 
    { 
     echo 'something'; 
    } 
} 

現在我可以只使用:

registry::doSomethine(); 

有人能向我解釋的功能是單例類的東西。我真的不明白這一點。

+0

[靜態類和單例模式之間的區別?](http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern) – Sarfraz 2010-05-17 14:08:10

+0

哎呀!對不起,我還沒有看到那一個。 – 2010-05-17 14:10:33

回答

8

靜態函數是一個可以在不創建類的對象的情況下調用的函數。

registry::doSomething() 

一個Singleton是設計圖案,應該防止類的用戶創建的類的多個實例。所以,通常只有一個單例類的一個例子。一個單身的構造應被宣佈私人,有一個靜態方法提供一個單一實例對象:

class Singleton 
{ 
    private Singleton() 
    { 
    } 

    private static var $instance = null; 

    public static getInstance() 
    { 
    if(self::$instance == null) 
     self::$instance = new Singleton(); 
    return self::$instance; 
    } 
} 

欲瞭解更多信息,請參閱http://en.wikipedia.org/wiki/Singleton_pattern

PS:對不起,我的壞PHP,語法可能不100%正確,但你應該粗略地理解我的意思是OOP。

1

的事實,辛格爾頓是限制類的實例化一個單一對象設計模式,就可以做一些東西,稍難是一個靜態類:

  • 延遲初始化
  • 通過內部更換執行子類的工廠
  • 通過配置管理

不過,也有一些缺點單噸,所以一般情況下使用Factory等模式會更好,因爲您可以獲得其他優勢,如解耦。

相關問題