首頁 >後端開發 >PHP問題 >php中靜態變數和普通變數有什麼差別

php中靜態變數和普通變數有什麼差別

青灯夜游
青灯夜游原創
2022-01-27 17:10:374404瀏覽

區別:1、靜態變數只初始化一次,而普通變數可以初始化多次。 2.普通全域變數的作用域是整個原始程序,當一個原始程式由多個來源檔案組成時,普通全域變數在各個來源檔案中都是有效的;而靜態全域變數只在定義該變數的來源檔案內有效。

php中靜態變數和普通變數有什麼差別

本教學操作環境:windows7系統、PHP7.1版、DELL G3電腦

在變數的前面加上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; 這個宣告方式是對的。

推薦學習:《PHP影片教學

以上是php中靜態變數和普通變數有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn