【问题标题】:Initialize static member with custom class in php在php中使用自定义类初始化静态成员
【发布时间】:2011-04-09 15:47:51
【问题描述】:

因为 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();有没有更好的办法解决这个问题?

【问题讨论】:

    标签: php initialization static-members


    【解决方案1】:

    这很烦人,我知道。我解决它就像

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

    它有点类似于 java 的“静态代码块”(或任何它们被称为 ^^)

    无论如何,该文件只能包含一次(因为发生“类已定义”错误),因此您可以确定,该类下面的代码也被执行一次。

    【讨论】:

    • 嗨,这是一个不错的方法。但是我需要一个公共 c'tor... 我会考虑的... ;)
    • 不,您不需要公共构造函数。作业在课堂之外。这不适用于protectedprivate 静态属性,当然你需要一个构造函数。
    • 如果您将变量分配给存储变量的类的新实例,您会这样做:Foo::$var = new Foo;
    • @KingCrunch。哎呀,没有更好的解决方案吗?
    • @Pacerier 是的,一个公共构造函数 :) self::$var or self::$var = new Foo;。但这要求您至少实例化该类一次。除了类之外的这段代码并没有错,甚至是坏的。它最多是(取决于约定)“丑陋”。无论如何,总是想一想,如果你真的需要静态。通常最好配置类 (setFoo()) 并从外部传递值。
    【解决方案2】:

    引用static的手册页:

    像任何其他 PHP 静态变量一样, 静态属性只能是 使用文字初始化或 持续的;不允许表达。 所以虽然你可以初始化一个静态 属性为整数或数组(对于 实例),你可能不会初始化它 到另一个变量,到一个函数 返回值,或返回到一个对象。

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

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

    【讨论】:

    • 嗨帕斯卡,谢谢您的快速回复。我会保留我的解决方法。
    【解决方案3】:

    作为一种优化,您可以将对象实例存储为静态字段,这样您就不会在每次调用静态方法时都创建一个新对象:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2015-05-18
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      相关资源
      最近更新 更多