PHP靜態成員變數和非靜態成員變數詳解

2022-10-04 05:30:09 字數 2405 閱讀 8233

資料成員可以分靜態變數、非靜態變數兩種.

靜態成員:靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名+靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員..因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜態的成員.

非成靜態員:所有沒有加static的成員都是非靜態成員,當類被例項化之後,可以通過例項化的類名進行訪問..非靜態成員的生存期決定於該類的生存期..而靜態成員則不存在生存期的概念,因為靜態成員始終駐留在內容中..

乙個類中也可以包含靜態成員和非靜態成員,類中也包括靜態建構函式和非靜態建構函式..

分兩個方面來總結,第一方面主要是相對於面向過程而言,即在這方面不涉及到類,第二方面相對於物件導向而言,主要說明static在類中的作用。

一、在面向過程設計中的static關鍵字

1、靜態全域性變數

定義:在全域性變數前,加上關鍵字 static 該變數就被定義成為了乙個靜態全域性變數。

特點:  a、該變數在全域性資料區分配記憶體。

b、初始化:如果不顯式初始化,那麼將被隱式初始化為0(自動變數是隨機的,除非顯式地初始化)。

c、訪變數只在本原始檔可見,嚴格的講應該為定義之處開始到本檔案結束。

例(摘於c++程式設計教程---錢能主編p103):         

//example 1

#include

void fn();

static int n; //定義靜態全域性變數

void main()

void fn()

d、檔案作用域下宣告的const的常量預設為static儲存型別。

靜態變數都在全域性資料區分配記憶體,包括後面將要提到的靜態區域性變數。對於乙個完整的程式,在記憶體中的分布情況如下圖: 

一般程式的由new產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料(即使是函式內部的靜態區域性變數)也存放在全域性資料區。全域性資料區的資料並不會因為函式的退出而釋放空間。細心的讀者可能會發現,example 1中的**中將

static int n; //定義靜態全域性變數

改為:int n; //定義全域性變數

程式照樣正常執行。的確,定義全域性變數就可以實現變數在檔案中的共享,但定義靜態全域性變數還有以下好處:

您可以將上述示例**改為如下:

//example 2

//file1

#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靜態成員變數和非靜態成員變數詳解

本文位址: /wangluo/php/179204.html

PHP靜態成員變數和非靜態成員變數

php靜態成員變數和非靜態成員變數 突然在網上找到了一遍對php靜態變數和非靜態變數講解比較深入的一遍文章,特轉來分享下。資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態...

PHP靜態成員變數和非靜態成員變數

資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類 中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配內 存,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中...

靜態成員和非靜態成員

類中的成員要麼是靜態的要麼是非靜態的。一般來說,靜態成員都歸屬於類所有,使用 static 關鍵字來宣告,不能在類的例項中訪問靜態成員 非靜態成員屬於類的例項 物件所有,不能按照類訪問靜態成員來訪問。下面用乙個例項來幫助理解 using system using system.collections...