2010-06-19 62 views
2

是否有任何原因我不應該使用靜態方法創建最終類來避免某些內部函數被調用?使用類作爲命名空間

final class ModuleGlobalFunctions { 
    static public function generateWord { 
    $result = ''; 

    while (strlen($result) < 12) { 
     $result = self::generateSyllable(); 
    } 

    return $result 
    } 

    static private function generateSyllable() { 
    // Generates a random syllable. 
    // … 
    } 
} 

$word = ModuleGlobalFunctions::generateWord(); 

// It raises an error. 
$syllable = ModuleGlobalFunctions::generateSyllable(); 

回答

2

那麼,我個人會推薦使用類來對類似的邏輯進行分組。所以在你的情況下(你提供的例子),這是一個好主意。

至於最終,這是一個折騰。我更喜歡使用抽象來防止實例化(因爲PHP不支持靜態類)。如果你使用final,我會建議添加一個私有構造函數來防止實例化:private function __construct() {} ...

就個人而言,我喜歡保持靜態的概念。原因是三重。首先,它在內存上更容易(因爲沒有實例需要跟蹤)。其次,速度更快(靜態方法調用比實例方法調用更快)。第三,更重要的是,這是有道理的。實例有一個狀態(這就是爲什麼它們是實例)。你的課堂是否需要一個國家?如果是這樣,那麼使用一個實例。如果沒有,那正是靜態類是用於...

至於傳遞一個實例作爲Sjoerd提到,你可以做靜態類(實際上比實例不太緊密耦合)。原因如下。除非你需要(並檢查)一個接口或繼承,否則你不知道該對象是否實際實現了方法generateWord()。但是,如果你傳遞迴調,那麼訪問方法(或其底層構造)並不重要,重要的是它具有相同(或相似)的語法(關於參數和返回值)。現在,接口是一個更好的解決方案(因爲它強制實現接口),但它們需要對OOP有非常深入的理解才能使設計正確。在一個捏,一個回調將工作相當好的情況下...

+0

更快的論據是非常薄弱的​​;差異很小:http://codepad.viper-7.com/dhL1dK – Artefacto 2010-06-19 12:47:51

+0

由於相同的原因,內存參數很弱。 – Sjoerd 2010-06-20 17:42:58

3

創建類屏蔽掉私有函數是一個好主意。這樣,類中的公共方法可以調用私有方法,而無需從類外部調用私有方法。

創建一個班級最後也是一個好主意,因爲這表明該班級沒有被設計爲重載考慮,並且使班級變得更簡單。

使類靜態是一個壞主意,因爲它將呼叫者緊緊地耦合到類。如果您調用Test :: generateWord(),它將始終使用Test類。但是,如果使用$ test-> generateWord(),則可以傳入另一個類,這會創建其他詞。這使得更改軟件變得更加容易,並且更容易對其進行單元測試。