在php中使用自定义类初始化静态成员

时间:2011-04-09 15:47:52

标签: php initialization static-members

由于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();方式或有更好的解决方案来解决这个问题?

3 个答案:

答案 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;
}

但是,首先定义字段时,无法将新对象实例分配给类字段,这很烦人。 :(