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

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

WBOY
WBOYオリジナル
2016-07-13 09:57:25812ブラウズ

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() です。ただし、通常の関数と比較すると、静的メンバー関数はオブジェクトに関連付けられていないため、このポインターがありません。この意味で、クラス オブジェクトに属する非静的データ メンバーや非静的メンバー関数にアクセスすることはできず、残りの静的メンバー関数のみを呼び出すことができます。以下は静的メンバー関数の例です。
  • リーリー
静的メンバー関数については、次の点に要約できます:

  • クラスの外に現れる関数定義ではキーワード static を指定できません。
  • 静的メンバーは、静的データメンバーにアクセスする静的メンバー関数や静的メンバー関数にアクセスするなど、相互にアクセスできます。
  • 非静的メンバー関数は、静的メンバー関数および静的データ メンバーに任意にアクセスできます。
  • 静的メンバー関数は、非静的メンバー関数および非静的データ メンバーにアクセスできません。
  • このポインターには追加のオーバーヘッドがないため、静的メンバー関数はクラスのグローバル関数と比較して速度がわずかに向上します。
  • 静的メンバー関数を呼び出すには、メンバー アクセス演算子 (.) および (->) を使用して、クラス オブジェクトまたはクラス オブジェクトへのポインターの静的メンバー関数を呼び出すことができます。

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

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

    クラスの静的プロパティは関数のグローバル変数に非常に似ています。

    静的メソッドは、クラスによってカプセル化される必要があり、特定のオブジェクトとは関係のない関数を実装します。

    静的メソッドは、グローバル関数に非常に似ています。静的メソッドは、クラスの属性に完全にアクセスでき、また、アクセスされる修飾子が何かであるかどうかに関係なく、オブジェクトのインスタンスによってアクセスされます。

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

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

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

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

    PHPの静的メソッドと非静的メソッド間の効率の問題

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

    2. クラス メソッドの戻り値を呼び出すだけで済み、静的メソッドを使用する方が合理的です。新しいものにより追加のオーバーヘッドが発生する可能性があります。

    http://www.bkjia.com/PHPjc/983243.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/983243.html技術記事 PHP の静的メンバー変数と非静的メンバー変数、PHP の静的データ メンバーは、静的変数と非静的変数の 2 つのタイプに分類できます。静的メンバー: 静的クラスのメンバーは、静的修飾子を追加します。つまり...
    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。