function test() {
static $test;
$test++;
echo($test . " ");
unset($test);
$test = 2;
echo($test . " ");
}
test();
test();
test();
結果:
1 2 2 2 3 2
我是這樣理解的,首先 static $test 在 test() 函數中定義了一個內存塊,變量 $test 則是對該內存塊的一個引用,然后 $test++ 后,是對該靜態內存塊的疊加,后面 unset($test) 之后,僅僅是變量 $test 對之前那塊靜態內存區域的引用失效了(之前的靜態內存塊依然存在,但 $test 變量本身已經被毀),再后面,$test = 2,則是新申請了一塊內存 以及 一個新的變量 $test。
關於摧毀引用的那幾行代碼,有點類似於下面代碼:
$a = 1;
$b = & $a;
unset($a);
結果 $a 被銷毀,但輸出 $b 結果仍為 1。
再對比上面的靜態變量,道理都一致,由於PHP是引用計數,只要有對該內存塊的引用,該內存塊就不會被銷毀(此亦是容易引起循環引用問題的主要原因)。