Detaillierte Erläuterung statischer Mitgliedsvariablen und nicht statischer Mitgliedsvariablen in PHP

墨辰丷
Freigeben: 2023-03-27 22:44:01
Original
1510 Leute haben es durchsucht

Datenelemente können in statische Variablen und nicht statische Variablen unterteilt werden. In diesem Artikel werden hauptsächlich statische PHP-Elementvariablen und nicht statische Elementvariablen vorgestellt.

Datenelemente können unterteilt werden in statische Variablen, zwei Arten von nicht statischen Variablen

Statische Mitglieder: Mitglieder in einer statischen Klasse fügen den statischen Modifikator hinzu, der ein statisches Mitglied ist + statischer Mitgliedsname, um auf dieses statische Mitglied zuzugreifen, da statische Mitglieder im Speicher vorhanden sind und nicht statische Mitglieder instanziiert werden müssen, bevor Speicher zugewiesen wird, sodass statische Mitglieder nicht auf nicht statische Mitglieder zugreifen können. Da statische Mitglieder im Speicher vorhanden sind, sind nicht statische Mitglieder vorhanden. Statische Mitglieder können direkt auf statische Mitglieder in der Klasse zugreifen.

Nicht statische Mitglieder:

Alle Mitglieder ohne statische Elemente sind nicht statische Mitglieder Instanziierter Klassenname. Die Lebensdauer wird durch die Lebensdauer der Klasse bestimmt. Es gibt kein Konzept der Lebensdauer für statische Mitglieder, da sich statische Mitglieder immer im Inhalt befinden Mitglieder und nicht statische Mitglieder. Klassen umfassen auch statische Konstruktoren und nicht statische Konstruktoren. Der erste Aspekt bezieht sich hauptsächlich auf den prozessorientierten Aspekt, das heißt, Klassen sind nicht beteiligt In diesem Aspekt erklärt der zweite Aspekt im Vergleich zur Objektorientierung hauptsächlich die Rolle der Statik in Klassen.


1. Das statische Schlüsselwort im prozessorientierten Design

1. Statische globale Variablen

Definition: Fügen Sie das Schlüsselwort static vor der globalen Variablen hinzu und die Variable wird als statische globale Variable definiert. Funktionen:

A. Diese Variable reserviert Speicher im globalen Datenbereich.

B. Initialisierung: Wenn sie nicht explizit initialisiert wird, wird sie implizit auf 0 initialisiert (automatische Variablen sind zufällig, sofern sie nicht explizit initialisiert werden).

C. Die Zugriffsvariable ist genau genommen nur in der Quelldatei sichtbar, sie sollte am Definitionspunkt beginnen und in dieser Datei enden.

例(摘于C++程序设计教程---钱能主编P103):         //file1.cpp 
        //Example 1
       #include 
       void fn();
        static int n; //定义静态全局变量
        void main()
        {
    n=20;
    cout<    fn();
        }
        void fn()
        {
    n++;
    cout<        }
Nach dem Login kopieren

 D. Const-Konstanten, die im Dateibereich deklariert werden, verwenden standardmäßig den statischen Speichertyp.

Statische Variablen weisen Speicher im globalen Datenbereich zu, einschließlich statischer lokaler Variablen, die später erwähnt werden. Für ein vollständiges Programm ist die Verteilung im Speicher wie folgt:


Im Allgemeinen werden die von new im Programm generierten dynamischen Daten im Heap-Bereich gespeichert. und die dynamischen Daten innerhalb der Funktion werden im Heap-Bereich gespeichert. Automatische Variablen werden im Stapelbereich gespeichert. Automatische Variablen geben im Allgemeinen Speicherplatz frei, wenn die Funktion beendet wird, und statische Daten (sogar statische lokale Variablen innerhalb der Funktion) werden im globalen Datenbereich gespeichert. Die Daten im globalen Datenbereich geben beim Beenden der Funktion keinen Speicherplatz frei. Aufmerksame Leser werden möglicherweise feststellen, dass im Code in Beispiel 1

static int n; //Statische globale Variablen definieren

geändert wurde in:


int n ; //Globale Variablen definieren

Das Programm läuft weiterhin normal. Tatsächlich können Variablen durch die Definition globaler Variablen in Dateien gemeinsam genutzt werden, aber die Definition statischer globaler Variablen hat auch die folgenden Vorteile:

Statische globale Variablen können nicht von anderen Dateien verwendet werden (Anscheinend). der Unterschied extern sein)

  • Variablen mit demselben Namen können in anderen Dateien ohne Konflikt definiert werden

  • Sie können das obige Beispiel ändern Code zu Wie folgt:

//Example 2
//File1
#include 
void fn();
static int n; //定义静态全局变量(只能在本文件中使用)
void main()
{
 n=20;
 cout<
extern int n;(可在别的文件中引用这个变量)
void fn()
{
 n++;
 cout<
Nach dem Login kopieren

Beim Kompilieren und Ausführen von Beispiel 2 werden Sie feststellen, dass der obige Code separat kompiliert werden kann, beim Verknüpfen jedoch ein Fehler auftritt. Versuchen Sie,

static int n; //Statische globale Variablen

in


int n; //Definieren Sie globale Variablen zu ändern. Kompilieren Sie das Programm und führen Sie es erneut aus sorgfältig Verstehen Sie den Unterschied zwischen globalen Variablen und statischen globalen Variablen.

2. Statische lokale Variablen

Definition: Wenn das statische Schlüsselwort vor der lokalen Variablen hinzugefügt wird, wird die statische lokale Variable definiert.

Geben wir zunächst ein Beispiel für eine statische lokale Variable wie folgt:

//Example 3
#include 
void fn();
void main()
{
 fn();
 fn();
 fn();
}
void fn()
{
 static n=10;
 cout<
Nach dem Login kopieren

Normalerweise wird eine Variable im Funktionskörper definiert. und wann immer das Programm Wenn diese Anweisung ausgeführt wird, wird der lokalen Variablen Stapelspeicher zugewiesen. Wenn das Programm jedoch den Funktionskörper verlässt, beansprucht das System den Stapelspeicher zurück und lokale Variablen werden entsprechend ungültig.

Aber manchmal müssen wir den Wert einer Variablen zwischen Aufrufen speichern. Die übliche Idee besteht darin, hierfür eine globale Variable zu definieren. Auf diese Weise gehören die Variablen jedoch nicht mehr zur Funktion selbst und werden nicht mehr nur von der Funktion gesteuert, was die Wartung des Programms erschwert.

Statische lokale Variablen können dieses Problem lösen. Statische lokale Variablen werden im globalen Datenbereich statt auf dem Stapel gespeichert. Jeder Wert bleibt bis zum nächsten Aufruf erhalten, bis ein neuer Wert zugewiesen wird.

Funktionen:

A. Diese Variable reserviert Speicher im globalen Datenbereich.

B. Initialisierung: Wenn es nicht explizit initialisiert wird, wird es implizit auf 0 initialisiert und nachfolgende Funktionsaufrufe werden nicht mehr initialisiert.

  C、它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或 语句块结束时,其作用域随之结束。

3、静态函数(注意与类的静态成员函数区别)

定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。

特点:

  A、静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。   

静态函数的例子:

//Example 4
#include 
static void fn();//声明静态函数
void main()
{
 fn();
}
void fn()//定义静态函数
{
 int n=10;
 cout<
Nach dem Login kopieren

定义静态函数的好处:

  • 静态函数不能被其它文件所用;

  • 其它文件中可以定义相同名字的函数,不会发生冲突;

二、面向对象的static关键字(类中的static关键字)

1、静态数据成员

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。

//Example 5
#include 
class Myclass
{
public:
 Myclass(int a,int b,int c);
 void GetSum();
private:
 int a,b,c;
 static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Nach dem Login kopieren

Myclass::Myclass(int a,int b,int c)
{
 this->a=a;
 this->b=b;
 this->c=c;
 Sum+=a+b+c;
}

void Myclass::GetSum()
{
 cout<<"Sum="<
Nach dem Login kopieren

可以看出,静态数据成员有以下特点:

  • 对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;

  • 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;

  • 静态数据成员和普通数据成员一样遵从public,protected,private访问规则;

  • 因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;

  • 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:

  • <数据类型><类名>::<静态数据成员名>=<值>

  • 类的静态数据成员有两种访问形式:

  • <类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

  • 如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;

  • 静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;

  • 同全局变量相比,使用静态数据成员有两个优势:

静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;

可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

2、静态成员函数

  与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。下面举个静态成员函数的例子。

//Example 6
#include 
class Myclass
{
public:
 Myclass(int a,int b,int c);
 static void GetSum();/声明静态成员函数
private:
 int a,b,c;
 static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
 this->a=a;
 this->b=b;
 this->c=c;
 Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{
// cout<
Nach dem Login kopieren

Statische Mitglieder einer Klasse unterscheiden sich von allgemeinen Klassenmitgliedern: Statische Mitglieder haben nichts mit der Instanz des Objekts zu tun, sondern nur mit der Klasse selbst. Sie werden verwendet, um die Funktionen und Daten zu implementieren, die die Klasse kapseln möchte, umfassen jedoch nicht die Funktionen und Daten bestimmter Objekte. Statische Mitglieder umfassen statische Methoden und statische Eigenschaften.

Statische Eigenschaften enthalten Daten, die in einer Klasse gekapselt werden sollen, und können von allen Instanzen der Klasse gemeinsam genutzt werden. Tatsächlich sind die statischen Eigenschaften einer Klasse nicht nur einer festen Klasse zugehörig und beschränken Zugriffsmethoden, sondern auch den globalen Variablen einer Funktion sehr ähnlich.

Statische Methoden implementieren Funktionen, die von der Klasse gekapselt werden müssen und nichts mit bestimmten Objekten zu tun haben. Statische Methoden können vollständig auf die Attribute der Klasse zugreifen nach Instanzen des Objekts, unabhängig vom Zugriff. Was ist der Qualifizierer von .

Eine Klasse, die keine nicht statischen Mitglieder enthält, kann als statische Klasse bezeichnet werden. Eine statische Klasse kann auch als Namespace für globale Variablen und Funktionen verstanden werden!

Gewöhnliche Methoden werden mit -> aufgerufen. Statische Methoden gehören zu keinem Objekt. In einigen Fällen möchten wir sie sogar aufrufen, wenn kein gültiges Objekt vorhanden ist Methoden sollten verwendet werden. PHP erstellt diese Variable nicht innerhalb statischer Methoden, selbst wenn Sie sie von einem Objekt aus aufrufen.

Sie können eine Methode schreiben, um anzuzeigen, ob sie statisch oder nicht statisch aufgerufen wird, indem Sie prüfen, ob diese erstellt wird. Wenn Sie das Schlüsselwort static verwenden, ist diese Methode natürlich immer statisch, egal wie sie ist genannt.

Ihre Klasse kann auch konstante Attribute definieren. Sie müssen keine öffentlichen statischen Attribute verwenden. Konstante Attribute sind immer statische Attribute. Eigenschaften des Objekts.

Effizienzprobleme zwischen statischen PHP-Methoden und nicht-statischen Methoden

1. Die Zugriffseffizienz statischer Mitglieder ist nicht unbedingt höher als bei nicht statischen Mitgliedern >2, Sie müssen nur den Rückgabewert einer Klassenmethode aufrufen, und es ist sinnvoller, statische Methoden zu verwenden, da sonst aufgrund von neuen ein zusätzlicher Overhead entsteht.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.


Verwandte Empfehlungen:

Fehler bei der Verwendung von js

VariablenBereich

Detaillierte Erklärung von

Variablen und Funktionshebeschritten in JS

PHP-Lernen: Vordefinierte

VariablenDetails

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung statischer Mitgliedsvariablen und nicht statischer Mitgliedsvariablen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage