ホームページ バックエンド開発 PHPチュートリアル PHPの静的メンバー変数と非静的メンバー変数の詳しい説明

PHPの静的メンバー変数と非静的メンバー変数の詳しい説明

May 25, 2018 pm 02:45 PM
php 変数 メンバー

データメンバーは静的変数と非静的変数の2種類に分けられます。この記事では主にPHPの静的メンバー変数と非静的メンバー変数を紹介します。必要な方は参考にしてください。

データメンバーは2種類に分けられます。 : 静的変数と非静的変数。

静的メンバー: 静的クラスのメンバーは、静的メンバーであるため、クラス名 + 静的メンバー名を使用して直接アクセスできます。静的メンバーはメモリ内に存在し、非静的メンバーはインスタンス化される必要があります。そのため、静的メンバーはメモリ内に存在するため、非静的メンバーはクラス内の静的メンバーに直接アクセスできます。 非静的メンバー:

静的メンバーのないものはすべて、クラスがインスタンス化されると、インスタンス化されたクラス名を介してアクセスできます。非静的メンバーの有効期間は、クラスの有効期間によって決まります。静的メンバーには有効期間の概念がありません。静的メンバーは常にコンテンツ内に存在するためです。

クラスには静的メンバーと非静的メンバーも含めることができ、クラスには静的コンストラクターと非静的コンストラクターも含まれます。 2 つの側面にまとめると、まず 1 つ目は主にプロセス指向の側面に関するものです。つまり、クラスはこの側面には関与しません。2 つ目の側面はオブジェクト指向の側面に関連しており、主に static の役割を説明します。クラスで。


1. プロセス指向設計における static キーワード

1. 静的グローバル変数

定義: グローバル変数の前にキーワード static を追加すると、変数は静的グローバル変数として定義されます。 特徴:

A. この変数はグローバルデータ領域にメモリを割り当てます。

B. 初期化: 明示的に初期化されていない場合は、暗黙的に 0 に初期化されます (明示的に初期化されない限り、自動変数はランダムです)。

C. アクセス変数は、ソース ファイル内でのみ表示されます。厳密に言えば、定義の時点から始まり、このファイル内で終わる必要があります。

例(摘于C++程序设计教程---钱能主编P103):         //file1.cpp 
        //Example 1
       #include 
       void fn();
        static int n; //定义静态全局变量
        void main()
        {
    n=20;
    cout<    fn();
        }
        void fn()
        {
    n++;
    cout<        }
ログイン後にコピー

D. ファイルスコープで宣言されたconst定数は、デフォルトで静的ストレージ型になります。

静的変数は、後述する静的ローカル変数も含めて、グローバルデータ領域にメモリを割り当てます。完全なプログラムの場合、メモリ内の分布は次のようになります:


一般に、プログラム内で new によって生成された動的データはヒープ領域に格納され、関数内の自動変数はスタック領域に格納されます。 。自動変数は通常、関数の終了時にスペースを解放し、静的データ (関数内の静的ローカル変数も) がグローバル データ領域に格納されます。グローバル データ領域のデータは、関数が終了しても領域を解放しません。注意深い読者は、例 1 のコード

static int n;確かに、グローバル変数を定義することでファイル内で変数を共有できますが、静的グローバル変数を定義すると次のようなメリットもあります:


静的グローバル変数は他のファイルでは使用できません(externとは異なるようです)

その他 同じ名前の変数は競合することなくファイル内で定義できます。

  • 上記のコード例を次のように変更できます。

  • //Example 2
    //File1
    #include 
    void fn();
    static int n; //定义静态全局变量(只能在本文件中使用)
    void main()
    {
     n=20;
     cout<
    extern int n;(可在别的文件中引用这个变量)
    void fn()
    {
     n++;
     cout<
    ログイン後にコピー
  • 例 2 をコンパイルして実行すると、上記のコードは個別に渡すこともできます。コンパイルはできますが、リンク時にエラーが発生します。
  • static int n; //静的グローバル変数の定義

int n; //グローバル変数の定義

を変更してみて、グローバル変数と静的グローバル変数の違いをよく理解してください。


2. 静的ローカル変数

定義: ローカル変数の前に static キーワードを追加すると、静的ローカル変数が定義されます。

まず、静的ローカル変数の例を以下に示します。

//Example 3
#include 
void fn();
void main()
{
 fn();
 fn();
 fn();
}
void fn()
{
 static n=10;
 cout<
ログイン後にコピー

通常、変数は関数本体で定義され、プログラムが実行されるたびにスタックメモリがローカル変数に割り当てられます。この文。ただし、プログラムが関数本体を終了すると、システムはスタック メモリを再利用し、それに応じてローカル変数は無効になります。

しかし、呼び出しの間に変数の値を保存する必要がある場合もあります。通常の考え方は、これを行うためにグローバル変数を定義することです。しかし、この方法では、変数は関数自体に属さず、関数によってのみ制御されなくなり、プログラムの保守に不都合が生じます。

静的ローカル変数はこの問題を解決できます。静的ローカル変数は、スタックではなくグローバル データ領域に保存され、次回の呼び出しまで新しい値が割り当てられるまで保持されます。

特徴:

A. この変数はグローバルデータ領域にメモリを割り当てます。

B. 初期化: 明示的に初期化されない場合、暗黙的に 0 に初期化され、その後の関数呼び出しは初期化されなくなります。

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

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

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

特点:

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

静态函数的例子:

//Example 4
#include 
static void fn();//声明静态函数
void main()
{
 fn();
}
void fn()//定义静态函数
{
 int n=10;
 cout<
ログイン後にコピー

定义静态函数的好处:

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

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

二、面向对象的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;//定义并初始化静态数据成员
ログイン後にコピー

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="<
ログイン後にコピー

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

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

  • 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在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<
ログイン後にコピー

クラスの静的メンバーは一般的なクラス メンバーとは異なります。静的メンバーはオブジェクトのインスタンスとは何の関係も持た​​ず、クラス自体とのみ関係します。静的メンバーは、クラスがカプセル化する関数とデータを実装するために使用されますが、静的メソッドや静的プロパティなどの特定のオブジェクトの関数とデータは含まれません。

静的プロパティには、クラスにカプセル化されるデータが含まれており、クラスのすべてのインスタンスで共有できます。実際、固定クラスに属し、アクセス方法が制限されていることに加えて、クラスの静的プロパティは関数のグローバル変数と非常によく似ています。

静的メソッドは、クラスによってカプセル化される必要がある関数を実装し、特定のオブジェクトとは何の関係もありません。静的メソッドは、クラスの属性に完全にアクセスしたり、オブジェクトのインスタンスによってアクセスしたりすることができます。 、アクセス修飾子が What is it であるかどうかには関係ありません。

非静的メンバーを含まないクラスを静的クラスと呼ぶこともできます。静的クラスは、グローバル変数および関数の名前空間として理解することもできます。

通常のメソッドは -> で呼び出されます。PHP はどのオブジェクトにも属さないこの変数を作成します。場合によっては、有効なオブジェクトがない場合でも静的メソッドを使用する必要があります。 . PHP は、オブジェクトから呼び出した場合でも、静的メソッド内にこの変数を作成しません。

もちろん、static キーワードを使用すると、このメソッドはどのように呼び出されても常に静的になります。

public static を使用せずに、const キーワードを使用するだけで、クラスで定数プロパティを定義することもできます。定数プロパティは常にクラスのプロパティであり、クラスをインスタンス化するオブジェクトのプロパティではありません。

PHP の静的メソッドと非静的メソッドの効率に関する問題

1. 静的メンバーのアクセス効率は、必ずしも非静的メンバーよりも高いとは限りません。

2. クラスメソッドの戻り値のみが必要です。呼び出される場合、静的メソッドを使用する方が効率的です。それ以外の場合は、new による追加のオーバーヘッドが発生します。

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。


関連する推奨事項:

js変数scopeを使用するときに発生するバグ

JS

Pの

変数の詳細な説明HP 学習: 事前定義された 変数 詳細

以上がPHPの静的メンバー変数と非静的メンバー変数の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles