php靜態成員變數和非靜態成員變數
突然在網上找到了一遍對php靜態變數和非靜態變數講解比較深入的一遍文章,特轉來分享下。
資料成員可以分靜態變數、非靜態變數兩種.
靜態成員:靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名+靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員..因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜態的成員.
非成靜態員:所有沒有加static的成員都是非靜態成員,當類被例項化之後,可以通過例項化的類名進行訪問..非靜態成員的生存期決定於該類的生存期..而靜態成員則不存在生存期的概念,因為靜態成員始終駐留在內容中..
乙個類中也可以包含靜態成員和非靜態成員,類中也包括靜態建構函式和非靜態建構函式..
分兩個方面來總結,第一方面主要是相對於面向過程而言,即在這方面不涉及到類,第二方面相對於物件導向而言,主要說明static在類中的作用。
一、在面向過程設計中的static關鍵字
1、靜態全域性變數
定義:在全域性變數前,加上關鍵字 static 該變數就被定義成為了乙個靜態全域性變數。
特點:
a、該變數在全域性資料區分配記憶體。
b、初始化:如果不顯式初始化,那麼將被隱式初始化為0(自動變數是隨機的,除非顯式地初始化)。
c、訪變數只在本原始檔可見,嚴格的講應該為定義之處開始到本檔案結束。
例(摘於c++程式設計教程---錢能主編p103):
//example 1
#include
void fn();
static int n; //定義靜態全域性變數
void main()
void fn()
void fn()//定義靜態函式
;int myclass::sum=0;//定義並初始化靜態資料成員
myclass::myclass(int a,int b,int c)
void myclass::getsum()
;int myclass::sum=0;//定義並初始化靜態資料成員
myclass::myclass(int a,int b,int c)
void myclass::getsum() //靜態成員函式的實現
{// cout<關於靜態成員函式,可以總結為以下幾點:
類的靜態成員與一般的類成員不同: 靜態成員與物件的例項無關,只與類本身有關。他們用來實現類要封裝的功能和資料,但不包括特定物件的功能和資料,靜態成員包括靜態方法和靜態屬性。
靜態屬性包含在類中要封裝的資料,可以由所有類的例項共享。實際上,除了屬於乙個固定的類並限制訪問方式外,類的靜態屬性非常類似於函式的全域性變數。
靜態方法則實現類需要封裝的功能,與特定的物件無關.靜態方法非常類似於全域性函式.靜態方法可以完全訪問類的屬性,也可以由物件的例項來訪問,不論訪問的限定語是否是什麼。
不包含任何非靜態成員的類可以稱作靜態類,乙個靜態類也可以理解為乙個全域性變數和函式的命名空間!
普通的方法用->來呼叫. php會建立乙個this變數,靜態方法不屬於任何物件.在有些情況下,我們甚至希望在不存在有效的物件時呼叫它,那麼就應該使用靜態方法. php將不在靜態方法內部建立this變數,即使你從乙個物件中呼叫它們。
你可以寫乙個方法通過判斷this是否建立來顯示是否它被靜態地或者非靜態地呼叫. 當然,如果你用了static 關鍵字,不管它怎樣被呼叫,這個方法總是靜態的。
你的類也可以定義常量屬性,不需要使用public static,只需要用const關鍵字即可. 常量屬性總是靜態的.它們是類的屬性,而不是例項化該類的物件的屬性。
php靜態方法與非靜態方法效率的問題
1、靜態成員訪問效率並不一定比非靜態成員高;
2、只需要呼叫乙個類的方法的返回值,使用靜態方法更合理,否則會因為new而有額外的開銷。
PHP靜態成員變數和非靜態成員變數
資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類 中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配內 存,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中...
PHP靜態成員變數和非靜態成員變數詳解
資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...
靜態成員和非靜態成員
類中的成員要麼是靜態的要麼是非靜態的。一般來說,靜態成員都歸屬於類所有,使用 static 關鍵字來宣告,不能在類的例項中訪問靜態成員 非靜態成員屬於類的例項 物件所有,不能按照類訪問靜態成員來訪問。下面用乙個例項來幫助理解 using system using system.collections...