2009-11-10 50 views
1

除了在類中聲明每個函數爲「靜態」,還有什麼方法可以讓類本身成爲「靜態」?PHP中的靜態類

+1

你想用「靜態」類來完成什麼? – dnagirl 2009-11-10 13:04:18

+0

靜態類和充滿函數的模塊/文件有什麼區別? – workmad3 2009-11-10 13:11:32

+0

@dnagirl:我想在不添加「require ...」的情況下調用它的函數。類中的方法必須是可直接訪問的。 – RKh 2009-11-10 13:11:52

回答

3

我想說的最好的方法是通過一個私人構造函數來防止對象實例化,並明確地將所有方法標記爲靜態。儘管必須小心地將所有方法標記爲靜態(這是PHP中不存在的靜態類的結果),但此方法相對於Singleton方法的好處是靜態方法比非靜態方法更有效。你可能也希望你的類被標記爲final,因爲大多數靜態類沒有被設計爲無論如何被擴展(這是一個很好的習慣)。

一個例子是這樣的:

final class PseudoStatic { 

    /** 
    * Prevent object instantiation 
    */ 
    private function __construct() {} 

    static public function method1() { 
    ... 
    } 

    static public function method2() { 
    ... 
    } 

    ... 
} 

此外,Singleton pattern is now considered a bad practice by some

7

不在PHP中 - 您必須將每個成員標記爲static,您希望它們是靜態的。有關信息,請參閱the PHP manual

0

你可以看看這個page,但我不認爲你可以聲明整個類是靜態的。

+0

@mnml:在發佈之前已經看到該頁面。不管怎麼說,還是要謝謝你。 – RKh 2009-11-10 13:13:59

0

或者如果你真正想要實現的是隻有一個類實例,那麼使構造函數是私有的,並提供靜態實例()方法。例如:

class PseudoStatic { 

    static private $instance; 

    private function __construct() {} 

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

} 

$instance = new PseudoStatic(); // error! 
$instance = PseudoStatic::instance(); // force one instance only 
+2

這更像一個單獨的模式,並且與靜態類無關... – 2009-11-10 13:14:06

+4

這是單例模式,它與靜態 – Ian 2009-11-10 13:15:42

+0

不一樣,我提出了一個解決方法,因爲靜態類還沒有真正存在PHP5。也許php6或php7?對我來說,只要一個建議能夠解決問題,它並不需要回答這個問題;) – Lukman 2009-11-10 13:17:25

5

沒有什麼可比的(例如)Java靜態類的方式。如果您只想在某種庫中收集函數,則可以將__construct()和__clone()方法設置爲私有。這將阻止創建實例。