2013-12-08 185 views
-1

我想访问静态函数中的类的静态字段,但该字段仍然是<Uninitialized>。我怎样才能初始化这个领域?PHP静态初始化器

<?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

+0

[It works just fine](http://3v4l.org/F3YNE)。 – vascowhite

回答

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->则不需要。

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

希望这回答你的问题。

+0

谢谢!使用'self :: $ lookup [0]'它工作正常:)我看到使用'self'来访问manuel中的一个静态成员,但它被称为非静态函数,所以我认为'self'在Java中是'this'的含义:)并且在PDT中缺少另一个提示:暂停return语句并查找变量值,Eclipse始终显示''。该变量只有在第一次访问后才被初始化,如'$ result = self :: $ lookup [0];'。这让我感到困惑,因为我是一个PHP初学者:) – Vertex

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

要在这里解释一下,它总是更好地使用这个概念,你只指定要使用的属性对象,并不关心创建对象。

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

我不能更好地解释这一点。我不是坏人。我只将这个概念用作应用程序全局变量的替代。

希望它有帮助!

+0

谢谢!这是另一种解决方案,但在我的一个简单的CRC16算法的情况下,我认为不需要为它使用单例模式。 – Vertex