由于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
我用这个“工作了”:
class CacheMode{
public static function NO_CACHE(){
return new CacheMode(1, __("No cache",'footballStandings'));
}
public static function FILE_CACHE(){
return new CacheMode(2, __("Filecache",'footballStandings'));
}
public static function VALUES(){
return array(self::NO_CACHE(), self::FILE_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;
}
}
它有效,但我对此并不满意。 任何人都可以解释,为什么我不能做静态$ xyz = new XYZ();方式或有更好的解决方案来解决这个问题?
答案 0 :(得分:3)
我很烦,我知道。我像
一样解决它class Foo {
public static $var;
}
Foo::$var = new BarClass;
它有点类似于javas“静态代码块”(或者它们被称为^^)
该文件只能包含一次(因为发生了“类已定义”错误),因此您可以确定,该类下面的代码也会被执行一次。
答案 1 :(得分:1)
引用static
的手册页:
与任何其他PHP静态变量一样, 静态属性可能只是 使用文字或文字初始化 不变;表达式是不允许的。 所以你可以初始化静态 属性为整数或数组(for 例如),你可能不会初始化它 另一个变量,一个函数 返回值,或对象。
这就是你不能做的原因
public static $NO_CACHE = new CacheMode(1, "No cache");
答案 2 :(得分:1)
作为优化,您可以将对象实例存储为静态字段,这样每次调用静态方法时都不会创建新对象:
private static $noCache;
public static function NO_CACHE(){
if (self::$noCache == null){
self::$noCache = new CacheMode(1, __("No cache",'footballStandings'));
}
return self::$noCache;
}
但是,首先定义字段时,无法将新对象实例分配给类字段,这很烦人。 :(