1、在變數的前面加上static 就構成了靜態變數(static 變數)。
2、static變數和普通變數的差異在於非靜態全域變數的作用域是整個原始程序,當一個來源程式由多個來源檔案組成時,非靜態的全域變數在各個來源文件中都是有效的。 而靜態全域變數則限制了其作用域, 即只在定義該變數的來源檔案內有效, 在同一原始程式的其它來源檔案中不能使用它。由於靜態全域變數的作用域侷限於一個原始檔內,只能為該來源檔案內的函數公用, 因此可以避免在其它原始檔中造成錯誤。
3、static變數和普通變數的差異:
static全域變數與普通全域變數差異:static全域變數只初使化一次,防止在其他檔案單元中被引用;
static局部變數和普通局部變數區別:static局部變數只初始化一次,下一次依據上一次結果值;
static函數與普通函數區別:static函數在記憶體中只有一份,普通函數在每個被調用中維持一份拷貝。
4、在全域變數之前加上關鍵字static,全域變數就定義成為一個全域靜態變數。
1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式運行期間都存在)
2)初始化:未經初始化的全域靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
3)作用域:全域靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。
5、static 變數的好處:
不會被其他檔案所訪問,修改
其他檔案中可以使用相同名字的變量,不會發生衝突。
記憶體中的位置:靜態儲存區
初始化:未初始化的全域靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
作用域:作用域仍為局部作用域,當定義它的函數或語句區塊結束的時候,作用域隨之結束。
注意:當static用來修飾局部變數的時候,它就改變了局部變數的儲存位置,從原來的堆疊中存放改為靜態儲存區。但是局部靜態變數在離開作用域之後,並沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行存取。
當static用來修飾全域變數的時候,它就改變了全域變數的作用域(在宣告他的檔案之外是不可見的),但沒有改變它的存放位置,還是在靜態儲存區中。
static 是定義一個靜態物件或靜態變量,關於static 定義的變數或類別方法有什麼特性我們看完本文章的相關實例後就見分曉了。
1. 建立物件$object = new Class(),然後使用」->」呼叫:$object->attribute/function,前提是該變數/方法可存取。
2. 直接呼叫類別方法/變數:class::attribute/function,無論是靜態/非靜態都可以。但有前提條件:
A. 如果是變量,需要該變數可存取。
B. 如果是方法,除了該方法可存取外,還需要滿足:
b1) 如果是靜態方法,沒有特殊條件;
b2) 如果是非靜態方法,需要改方法中沒有使用$this,也就是沒有呼叫非靜態的變數/方法,當然,呼叫靜態的變數/方法沒有問題。
然後我們再看一下使用$object->… 和使用class::…都有什麼區別:
1. 使用$object->… ,需要執行建構子創建物件;
2. 使用class::…呼叫靜態方法/變量,不需要執行建構子建立物件;
3. 使用class::… 呼叫非靜態方法/變量,也不需要執行建構子創建對象。
然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變數存在還有什麼意義呢?
靜態 static
宣告類別成員或方法為 static ,就可以不實例化類別而直接訪問,不能透過一個物件存取其中的靜態成員(靜態方法除外)。靜態成員屬於類,不屬於任何物件實例,但類別的物件實例都能共用。
以上是php:static靜態變數和普通變數的區別分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!