2013-12-08 186 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