【问题标题】:PHP static initializerPHP 静态初始化器
【发布时间】:2013-12-08 10:38:55
【问题描述】:

我想在静态函数中访问一个类的静态字段,但该字段仍然是<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 中可以看到&lt;Unitialized&gt;

【问题讨论】:

标签: php static


【解决方案1】:

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

我已经对下面的代码进行了测试,它似乎可以工作。奇怪的是,我还对你的代码进行了测试,这似乎也可以正常工作。

要解决这个问题,在您的计算函数中,您应该使用 return self::$lookup[0]; 而不是 return StaticTest::$lookup[0];

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

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

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

希望这能回答你的问题。

【讨论】:

  • 谢谢!使用self::$lookup[0] 它可以正常工作:) 我看到使用self 来访问manuel 中的静态成员,但它是在非静态函数中调用的,所以我假设selfthis 等效在 Java 中:) PDT 中缺少另一个提示:暂停返回语句并查找变量值,Eclipse 始终显示&lt;Uninitialized&gt;。该变量仅在第一次访问后才被初始化,例如$result = self::$lookup[0];。作为一个 PHP 初学者,这让我感到困惑 :)
【解决方案2】:

编辑您的代码,它应该可以按您的意愿工作:

<?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();

在这里解释一下,最好使用只指定要使用对象的属性而不关心创建对象的概念。

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

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

希望对你有帮助!

【讨论】:

  • 谢谢!这是另一种解决方案,但在我的简单 CRC16 算法的情况下,我认为没有必要使用单例模式。
猜你喜欢
  • 2011-03-19
  • 2014-10-06
  • 2011-02-06
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多