2011-04-15 104 views
2

寫一個PHP應用程序,還有好幾類,只有具有靜態方法(無需實例方法)。一個例子是NumericValidator,其中有像checkInteger($toCheck)方法進行檢查,確保參數傳遞給它的類型是int,和checkGreaterThan($lOperand, $rOperand),這確保了左操作數大於右操作數越大,等純靜態類VS辛格爾頓

我知道我可以只是扔每種方法到PHP文件,而不把它們一個類裏面,但我想萬一API發展到需要實例NumericValidator在這裏採取的OOP方法。

但說實在的問題:怎麼是100%的靜態方法比有一個類實現一個Singleton設計模式,在整個代碼庫中使用的每個引用調用相同的實例有什麼不同的一類?

例如,這裏是我的代碼看起來像現在:

public function doSomething($p_iNum) 
{ 
    if(!NumericValidator::checkInteger($p_iNum)) 
     // throw IllegalArgumentException 

    // ... 
} 

但我可以把所有的NumericValidator的靜態方法到非靜態實例方法,迫使程序員實例化,然後執行一個Singleton設計模式,所以你永遠只能參考它的1個實例:

public function doSomething($p_iNum) 
{ 
    NumericValidator $nv = NumericValidator::getInstance(); 

    if(!nv->checkInteger($p_iNum)) 
     // throw IllegalArgumentException 

    // ... 
} 

最後,我的問題:這是在保持機智更好,更h最佳實踐?有沒有性能方面的考慮?這兩種方法如何影響諸如併發性或來自多個用戶的請求?

+0

你爲什麼要爲is_int編寫一個包裝對象成員函數? – markus 2011-04-15 20:47:21

+0

我使用NumericValidator作爲*示例*。實際上,無論我的*示例*是否具有邏輯意義,與我所問的問題無關,這與100%純靜態類與單例之間的性能差異有關。 – user709006 2011-04-15 20:51:03

+1

[靜態認爲有害](http://kore-nordmann.de/blog/0103_static_considered_harmful.html) – Gordon 2011-04-15 22:08:20

回答

1

我會在你的例子中使用一個靜態類。我將使用的差異性是,如果您試圖跨訪問保存實例的任何屬性狀態。這是單身人士設計的。靜態類提供了對命名空間中的方法的有組織的訪問,這有助於清晰地瞭解代碼,但它沒有任何有關其自身的屬性。

所以是的,你可以使用單例,但它會是不好的形式,因爲沒有實例屬性,你希望跨頁訪問提供。

希望這會有所幫助。

0
  1. 僅當您要將變量中的NumericValidator的實例傳遞給某個函數時,才使用Singleton而不是靜態類。
  2. 在PHP 5.3,你可以得到靜態類的實例:

    類測試 { 公共靜態函數實例(){ 打印 'ZZ'; }}

    $ Z =新的考驗; $ z-> instance();

  3. 不要在意在PHP併發請求,它是單線程的,每個進程執行自己的代碼。

+0

我不會使用第1點作爲使用單身人士的理由。單例的目的是保持對共享實例的屬性的訪問。不是關於你是否將引用傳遞給另一個函數。 – Wes 2011-04-15 21:00:13

+0

我正在談論單身和靜態類之間的差異,而不僅僅是單身。 – 2011-04-15 21:11:22

+0

那麼你從「使用...」開始,這是我的參考點。 to之間的不同之處在於傳統上靜態類無法實例化,但PHP 5.3完全否定了這一點。 – Wes 2011-04-15 21:16:09