2012-01-13 47 views
0
class StaticTester 
    { 
     private static $id=0; 
     function__construct() 
    { 
      self::$id+=1; 
    } 
    public static function checkIdFromStaticMethod() 
    { 
     echo "Current Id from Static method is ".self::$id; 
    } 


} 

    $st1=new StaticTester(); 
StaticTester::checkIdFromStaticMethod();  // this outputs 1. 

好吧,我不明白爲什麼輸出是1? 畢竟靜態意味着值不能改變!無法獲得PHP中的靜態聲明行爲

回答

1
function__construct() 
{ 
    self::id+=1; 
} 

應該

function__construct() 
{ 
    self::$id+=1; 
} 

錯過了一個美元符號那裏:)

哎呀....誤讀的問題。我以爲你的代碼中有錯誤,呵呵。你所做的,但可能只是一個複製/粘貼錯誤。

它變成了一個,因爲每次創建一個新對象時都會增加1。並且所有對象共享相同的id變量。這是靜態的手段。

一個永遠不會改變的數字叫做constant,並在php中用關鍵字const聲明。

+0

現在tandu糾正了原來的問題,所以現在看起來更加遲鈍了。我應該刪除答案。甚至可能是我自己。 – davogotland 2012-01-13 17:18:01

+0

不要擔心tandu。你的答案實際上清除了「靜態」一詞的含義。謝謝 。 – kushalvm 2012-01-13 18:22:59

0

static並不意味着數值根本無法改變!您需要constfinal(PHP不具備)。 static實際上會保留方法調用之間的值(因爲它是一個成員,無論如何)。

+0

對於b.t.w.方法,Php確實有[final](http://www.php.net/manual/en/language.oop5.final.php),而不是屬性。 – Wrikken 2012-01-13 17:15:58

+0

'或final(哪個PHP沒有)' - 真的嗎? [自[when]](http://www.php.net/manual/en/language.oop5.final.php)? – DaveRandom 2012-01-13 17:16:13

+0

@DaveRandom'final'只適用於方法.. Wrikken甚至在評論之前說過。 – 2012-01-13 18:44:28

0

靜態並不意味着該值無法更改,這意味着該值保持在類級而不是實例級。其他語言(如Java)有時將其稱爲「類變量」。

我認爲你在staticfinalconst之間感到困惑。

手冊參考文獻:

0

靜態裝置:對於所有可能的情況下,相同的變量將被用於

function__construct() 
    { 
      self::$id+=1; 
    } 

$st1=new StaticTester(); 

在做新的時候,__construct被調用,所以你的$ id靜態變量會被用來增加&。 你可以做$ st2 = new StaticTester(),StaticTester :: checkIdFromStaticMethod()會返回2! 這就是你的代碼在編寫時的意圖。

同意「不變」的答案。