只要在變數前加上關鍵字static,該變數就成為靜態變數了。
<?php
function test()
{
static $nm = ;
$nm = $nm * ;
print $nm."<br />";
}
// 第一次執行,$nm =
test();
// 第一次執行,$nm =
test();
// 第一次執行,$nm =
test();
?>
程式運行結果:
1
2
2
4
3
8
函數test()執行後,變數$nm的值都儲存了下來了。
在class中經常使用到靜態屬性,比如靜態成員、靜態方法。
之前的公司的小兄弟要去面試PHP,他遇到了一道PHP基礎面試題,大致內容是如下:
function test(){
static $a = 0;
$a++;
echo "before unset ".$a."<br/>";
unset($a);
$a = 23;
echo "after unset ".$a."<br/>";
}
test();
test();
test();
看到這題的時候,就注意到了stats這個標記了$a。就知道這題不會是第一反應的結果。(結果如下)
這個$a 值沒有因為unset() 函數改變,而是一直在累計!!我知道unset()對應static狀態的變數是無效的。我馬上查看了手冊
unset() 銷毀指定的變數。
unset() 在函數中的行為會依賴於想要銷毀的變數的類型而有所不同。
如果在函數中
unset() 一個全域變數,則只是局部變數被銷毀,而在調用環境中的變數將保持調用
unset() 之前一樣的值。
如果在函數中
unset() 一個靜態變數,那麼在函數內部此靜態變數將被銷毀。但是,當再次調用此函數時,此靜態變數將被複原為上次被銷毀之前的值。
PHP變數關係圖
PHP的記憶體位址跟變數直接就是通過這種方式進行關聯的。一般的變數是是通過關聯的方式指向對應的地址,而不是真是的值。所以unset()的過程,其實是斷了之間的聯絡,而不是抹掉了記憶體位址的值。
而static在初始設定變數的,僅在局部函數域中存在,但當程式執行離開此範圍時,其值並不丟失。