ホームページ > バックエンド開発 > PHPチュートリアル > PHP 静的メンバー変数と非静的メンバー変数、php static_PHP チュートリアル

PHP 静的メンバー変数と非静的メンバー変数、php static_PHP チュートリアル

WBOY
リリース: 2016-07-13 09:57:25
オリジナル
811 人が閲覧しました

PHP 静的メンバー変数と非静的メンバー変数、php static

data メンバーは、静的変数と非静的変数の 2 つのタイプに分けることができます.
静的メンバー: 静的クラスのメンバーは、静的修飾子を追加することで静的メンバーになります。静的メンバーはメモリ内に存在し、非静的メンバーはインスタンス化する必要があるため、クラス名 + 静的メンバー名を使用してこの静的メンバーに直接アクセスできます。 静的メンバーが非静的メンバーにアクセスできないようにメモリを割り当てます。静的メンバーはメモリ内に存在するため、非静的メンバーはクラス内の静的メンバーに直接アクセスできます。

非静的メンバー: 静的でないメンバーはすべて非静的です。クラスがインスタンス化されると、インスタンス化されたクラス名を介してメンバーにアクセスできます。静的メンバーは常にクラス内に存在するため、静的メンバーの存続期間はクラスの存続期間によって決まります。 content..

クラスには静的メンバーと非静的メンバーを含めることもでき、クラスには静的コンストラクターと非静的コンストラクターを含めることもできます..

これは 2 つの側面に要約できます。最初の側面は主にプロセス指向に関連しており、クラスはこの側面には関与しません。2 番目の側面はオブジェクト指向に関連しており、主にクラスにおける static の役割を説明します。

1. プロセス指向設計の static キーワード

1. 静的グローバル変数

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

特徴:
A. この変数はグローバルデータ領域にメモリを割り当てます。
B. 初期化: 明示的に初期化されていない場合は、暗黙的に 0 に初期化されます (明示的に初期化されない限り、自動変数はランダムです)。
C. アクセス変数は、ソース ファイル内でのみ表示されます。厳密に言えば、定義ポイントから始まり、このファイル内で終わる必要があります。

例(C++プログラミングチュートリアル---編集者Qian Neng P103より抜粋): ///file1.cpp void fn(); /Define static global variables
void main() void main() lt;n< ; n & lt; & lt;
}

D. ファイルのスコープ内で宣言された constitime storage ストレージ タイプの定数のデフォルト。

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





コードエリア



グローバルデータエリア


ヒープ領域

スタックエリア

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

static int n; //静的グローバル変数を定義します

次のように変更されました:

リーリー

プログラムは引き続き正常に実行されます。確かに、グローバル変数を定義するとファイル内で変数を共有できますが、静的グローバル変数を定義すると次の利点もあります:

  • 静的グローバル変数は他のファイルでは使用できません(externとは異なるようです)
  • 同じ名前の変数は競合することなく他のファイルで定義できます。
上記のサンプルコードを次のように変更できます:

リーリー リーリー リーリー リーリー リーリー リーリー リーリー

まず、次のような静的ローカル変数の例を示します。 リーリー リーリー リーリー リーリー リーリー リーリー

静的関数は他のファイルでは使用できません;
  • 同じ名前の関数は競合することなく他のファイルで定義できます。
2. オブジェクト指向の静的キーワード (クラス内の静的キーワード)

1. 静的データメンバー

クラス内のデータ メンバーの宣言の前にキーワード static を追加すると、データ メンバーはクラス内の静的データ メンバーになります。まず、静的データ メンバーの例を示します。

リーリー

静的データ メンバーには次の特性があることがわかります:

非静的データ メンバーの場合、各クラス オブジェクトは独自のコピーを持ちます。静的データ メンバーはクラスのメンバーとして扱われます。このクラスのオブジェクトがいくつ定義されていても、プログラム内に存在する静的データ メンバーのコピーは 1 つだけであり、このタイプのすべてのオブジェクトによって共有され、アクセスされます。つまり、静的データ メンバーは、このクラスのすべてのオブジェクトに共通です。このクラスの複数のオブジェクトの場合、静的データ メンバーには 1 回だけメモリが割り当てられ、すべてのオブジェクトで共有されます。したがって、静的データ メンバーの値はすべてのオブジェクトで同じであり、その値は更新できます。

    静的データメンバーはグローバルデータ領域に保存されます。静的データ メンバーは定義時にスペースを割り当てる必要があるため、クラス宣言では定義できません。例 5 では、ステートメント int Myclass::Sum=0; は静的データ メンバーを定義します。
  • 静的データ メンバーは、通常のデータ メンバーと同じパブリック、保護、およびプライベート アクセス ルールに従います。
  • 静的データメンバーはグローバルデータ領域にメモリを割り当て、このクラスに属するすべてのオブジェクトによって共有されるため、クラスオブジェクトが生成されないとき、つまりクラスオブジェクトが生成されないとき、そのスコープは特定のクラスオブジェクトに属しません。クラスのインスタンスが生成されると、それを操作できます。
  • 静的データ メンバーの初期化は、一般的なデータ メンバーの初期化とは異なります。静的データ メンバーの初期化の形式は次のとおりです:
  • <データ型><クラス名>::<静的データ メンバー名>=<値>
  • クラスの静的データメンバーには 2 つのアクセス形式があります:
  • <クラスオブジェクト名>.<静的データメンバー名> または <クラス型名>::<静的データメンバー名>
  • 静的データメンバーのアクセス権がある場合許可すると (つまり、パブリック メンバー)、上記の形式に従ってプログラム内で静的データ メンバーを参照できます。

  • 静的データメンバーは主に、各オブジェクトが同じ属性を持つ場合に使用されます。たとえば、預金クラスの場合、各インスタンスの金利は同じです。したがって、金利は預金クラスの静的データ メンバーとして設定する必要があります。これには 2 つの利点があります。まず、定義されているデポジット クラス オブジェクトの数に関係なく、すべてのインタレスト データ メンバーがグローバル データ領域に割り当てられたメモリを共有するため、ストレージ スペースが節約されます。第二に、金利を変更する必要がある場合、一度変更する限り、すべての預金オブジェクトの金利が変更されます。
  • グローバル変数と比較して、静的データメンバーの使用には 2 つの利点があります:

  • 2. 静的メンバー関数
  • 静的データメンバーと同様に、特定のクラスの特定のオブジェクトを提供するのではなく、クラス全体にサービスを提供する静的メンバー関数を作成することもできます。静的メンバー関数は、静的データ メンバーと同様、クラスの内部実装であり、クラス定義の一部です。通常のメンバー関数は、常に特定のクラスの特定のオブジェクトに明確に属するため、通常のメンバー関数は、クラス自体のオブジェクトを指す this ポインターを暗黙に含みます。通常、これがデフォルトです。たとえば、関数 fn() は実際には this->fn() です。ただし、通常の関数と比較すると、静的メンバー関数はオブジェクトに関連付けられていないため、このポインターがありません。この意味で、クラス オブジェクトに属する非静的データ メンバーや非静的メンバー関数にアクセスすることはできず、残りの静的メンバー関数のみを呼び出すことができます。以下は静的メンバー関数の例です。
  • リーリー
静的メンバー関数については、次の点に要約できます: