PHP静态初始化器

时间:2013-12-08 10:38:55

标签: php static

我想在静态函数中访问类的静态字段,但该字段仍为<Uninitialized>。如何初始化此字段?

<?php
final class StaticTest {
    private static $lookup = array(123, 456, 789);

    public static function compute() {
        return StaticTest::$lookup[0];
    }
}

echo 'result: ' . StaticTest::compute();
?>

正如您在Eclipse PDT调试中的下图所示,静态字段$lookup<Unitialized>PDT show that $lookup is unitialized

2 个答案:

答案 0 :(得分:0)

编辑你的代码,它应该按你的意愿工作:

<?php
  final class StaticTest{
    protected static $instance;
    private $lookup = array(123, 456, 789);

    public function compute() {
      return $this->lookup[0];
    }

    public static function get(){
      if (!isset(self::$instance))
        self::$instance = new self();
      return self::$instance;
    }
  }
  echo 'result: ' . StaticTest::get()->compute();

为了在这里解释一下,使用这个概念总是更好,你只需要指定你想要使用object的属性而不关心创建对象。

它是自动完成的(它在创建的内存中不存在,如果它存在则被调用)。

我无法更好地解释这一点。我不是杞子。我只使用这个概念作为应用程序全局变量的替代。

希望它有所帮助!

答案 1 :(得分:0)

发生错误的原因是您尝试调用私有变量而不调用self来访问它。

我已经给下面的代码一个测试,它似乎工作。奇怪的是,我也给你的代码一个测试,这似乎也可以正常工作。

要解决此问题,请在计算功能中使用此return self::$lookup[0];代替return StaticTest::$lookup[0];

另一种解决方法是将private static $lookup = array(123, 456, 789);更改为public static $lookup = array(123, 456, 789);。这样做,您的代码可以正常工作,但不是推荐的方式。

这样做,它应该返回你想要的结果。可以认为它类似于非静态类,可以访问可以使用$this->的非静态类中的参数(私有或公共),而在静态类中,您应该使用self::。另外,使用self::访问变量并不需要$存在,而使用$this->则不会。{/ p>

Dejv提供的答案也可以,但是涉及使用单例类型类,这个程序绝对不需要,因为它每次实例化一个新类,完全忽略了静态变量和函数的工作方式。

希望这能回答你的问题。