2011-04-09 66 views
1

,因爲PHP中沒有枚舉我試圖做這樣的事情:在PHP自定義類初始化靜態成員

class CacheMode{  

    public static $NO_CACHE = new CacheMode(1, "No cache"); 

    private $id, $title; 

    public function getId(){ 
     return $this->id; 
    } 

    public function getTitle(){ 
     return $this->title; 
    } 

    private function __construct($id, $title){ 
     $this->id = $id; 
     $this->title = $title; 
    } 
} 

的問題是,我得到一個解析錯誤,如果我運行該腳本:

Parse error: syntax error, unexpected T_NEW 

我「的工作和身邊它」與此:

它的工作原理,但我不與它真的很高興。 任何人都可以解釋,爲什麼我不能做靜態$ xyz = new XYZ();方式還是有更好的解決這個問題?

回答

1

引用的static手冊頁:

像任何其他PHP靜態變量, 靜態屬性可以僅 使用文字或 恆定初始化;表達式是不允許的。 因此,儘管您可以將靜態 屬性初始化爲整數或數組(對於 實例),但您可能不會將其初始化爲 爲其他變量,返回值爲函數 或對象。

這就是爲什麼你不能這樣做

public static $NO_CACHE = new CacheMode(1, "No cache"); 
+0

嗨帕斯卡,thx快速回復。我會繼續我的解決方法。 – TerenceJackson 2011-04-09 15:53:23

3

其煩人,我知道了。我解決它像

class Foo { 
    public static $var; 
} 
Foo::$var = new BarClass; 

它類似於Java類「靜態代碼塊」(或者不管它們被稱爲^^)

該文件只includeable一點點反正一次(因爲一個「類已經定義「發生錯誤),所以你可以確定,該類下面的代碼也會執行一次。

+1

嗨,這是一個不錯的方法。但然後我需要一個公共c'tor ...我會考慮它... ;) – TerenceJackson 2011-04-09 16:08:01

+0

不,你不需要一個公共構造函數。這個任務不在課堂上。這不適用於'protected'或'private'靜態屬性,當然你需要一個構造函數。 – KingCrunch 2011-04-09 16:29:21

+0

如果您將變量分配給存儲變量的類的新實例:'Foo :: $ var = new Foo;' – Michael 2011-04-09 16:56:42

1

作爲一種優化,您可以將對象實例存儲爲靜態字段,這樣,你是不是每一個靜態方法被調用時創建一個新的對象:

private static $noCache; 
public static function NO_CACHE(){ 
    if (self::$noCache == null){ 
    self::$noCache = new CacheMode(1, __("No cache",'footballStandings')); 
    } 
    return self::$noCache; 
} 

但是,是的,它是煩人,當您第一次定義字段時,您無法將新對象實例分配給類字段。 :(