我想在静态函数中访问类的静态字段,但该字段仍为<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>
。
答案 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提供的答案也可以,但是涉及使用单例类型类,这个程序绝对不需要,因为它每次实例化一个新类,完全忽略了静态变量和函数的工作方式。
希望这能回答你的问题。