php中static 靜態變數和普通變數的區別
在變數的前面加上static 就構成了靜態變數(static 變數)。
static變數和普通變數的區別在於非靜態全域變數的作用域是整個原始程序,當一個原始程式由多個原始檔案組成時,非靜態的全域變數在各個原始檔案中都是有效的。 而靜態全域變數則限制了其作用域, 即只在定義該變數的來源檔案內有效, 在同一原始程式的其它來源檔案中不能使用它。由於靜態全域變數的作用域侷限於一個原始檔內,只能為該來源檔案內的函數公用, 因此可以避免在其它原始檔中造成錯誤。
static變數和普通變數的區別:
static全域變數與普通全域變數區別:static全域變數只初使化一次,防止在其他文件單元中被引用;
static局部變數和普通局部變數區別:static局部變數只初始化一次,下次依據上一次結果值;
static函數與普通函數區別:static函數在記憶體中只有一份,普通函數在每個被呼叫中維持一份拷貝。
在全域變數之前加上關鍵字static,全域變數就定義成為一個全域靜態變數。
1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式運作期間都存在)
2)初始化:未經初始化的全域靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
3)作用域:全域靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。
static 變數的好處:
不會被其他文件所訪問,修改其他文件中可以使用相同名字的變量,不會發生衝突。
記憶體中的位置:靜態儲存區
初始化:未經初始化的全域靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
作用域:作用域仍為局部作用域,當定義它的函數或語句區塊結束的時候,作用域隨之結束。
註:當static用來修飾局部變數的時候,它就改變了局部變數的儲存位置,並從原來的堆疊中存放改為靜態儲存區。但是局部靜態變數在離開作用域之後,並沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行存取。
當static用來修飾全域變數的時候,它就改變了全域變數的作用域(在宣告他的檔案之外是不可見的),但是沒有改變它的存放位置,還是在靜態儲存區中。
普通函數實例:
<?php function Test() { $w3sky = 0; echo $w3sky; $w3sky++; /*函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0"。将变量加一的 $w3sky++ 没有其到效果,因为一旦退出本函数则变量 $w3sky 就不存在了。*/ } ?>
要將變數 $w3sky 定義為靜態(static)的,程式碼如下:
<?php function Test() { static $w3sky = 0; echo $w3sky; $w3sky++; } //本函数每调用Test()都会输出 $w3sky 的值并加一。 ?>
靜態變數也提供了一種處理遞歸函數的方法。遞歸函數是一種自己呼叫自己的方法。寫遞歸函數時要小心,因為可能會無窮遞歸下去,沒有出口.務必確保 有方法來中止遞歸。以下這個簡單的函數遞歸計數到 10,使用靜態變數 $count 來判斷何時停止, 靜態變數與遞歸函數的例子:
<?php function Test() { static $count = 0; $count++; echo $count; if ($count < 10) { Test(); } $count--; } ?>
註: 靜態變數不能用表達式的方式宣告例如:static $int = 1+2; 這個方式就是錯的 而static $int = 1; 這種宣告方式是對的。
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!