2012-08-27 59 views
3

在PHP函數與靜態範圍工作時,我得到了這個例子:PHP靜態範圍重新聲明

function testStatic() { 
static $a; 
echo "here is a first time: ".$a."<br />"; 
$a = 23; 
static $a = 100; 
echo "here is a second time: ".$a."<br />"; 
} 

當我運行像這樣

teststatic(); echo "<hr />"; 
teststatic(); 

此功能下面它的輸出結果:

這裏是一個:100
這裏是一個:23


這裏是一個:23
這裏是一個:23

但我希望它是以下幾點:

這裏是一個:空
這裏是一個:100


這裏是:100
這裏是一個:100

我一直在思考小時試圖解釋爲什麼我收到上述結果,但真正的失敗。 你能告訴我爲什麼我們有上面的結果嗎?謝謝!

+0

看起來靜態變量的顯式定義首先被識別(就像函數一樣)。 –

+0

我從來沒有見過像這樣的函數中定義的靜態。通常它們在類上下文中定義,然後在成員方法內部或類外部引用。 –

回答

1

很難相信您指定的輸出確實是該代碼的輸出。然而,問題是在這裏明確:

一個static變量通過static關鍵字綁定到一個函數或類和聲明。您正在重新申報$a;這應該(我猜)會發出警告。

由於static屬性是函數或類定義的一部分,(顯然)它的最後一次出現將被「附加」到正在討論的函數/類中。

僅在第一次調用函數$a分配的23值。在第一個echo聲明之後。

這是一個兩步驟過程,第一解析器將讀取功能的定義,包括static性質。之後,代碼將運行,並且屬性發生變化。