在PHP自定义类初始化静态成员

在PHP自定义类初始化静态成员

问题描述:

,因为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();方式还是有更好的解决这个问题?

引用的static手册页:

像任何其他PHP静态变量, 静态属性可以仅 使用文字或 恒定初始化;表达式是不允许的。 因此,尽管您可以将静态 属性初始化为整数或数组(对于 实例),但您可能不会将其初始化为 为其他变量,返回值为函数 或对象。

这就是为什么你不能这样做

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

嗨帕斯卡,thx快速回复。我会继续我的解决方法。 – TerenceJackson 2011-04-09 15:53:23

其烦人,我知道了。我解决它像

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

作为一种优化,您可以将对象实例存储为静态字段,这样,你是不是每一个静态方法被调用时创建一个新的对象:

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

但是,是的,它是烦人,当您第一次定义字段时,您无法将新对象实例分配给类字段。 :(