PHPのstatic静的変数の詳細(一)

4636 ワード

static静的変数とは?(以下、C言語での理解)
静的変数タイプ説明子はstaticです.
静的変数は静的記憶方式に属し、その記憶空間はメモリ内の静的データ領域(静的記憶領域内に記憶手段を割り当てる)であり、この領域内のデータはプログラムの実行期間全体にわたってこれらの記憶空間を占有し続け(プログラムの実行期間全体にわたって解放されない)、メモリアドレスが不変であると考えられてもよい.プログラム全体の実行が終了するまで(逆にauto自動変数、すなわち動的ローカル変数は、動的ストレージカテゴリに属し、動的ストレージ空間を占め、関数呼び出しが終了すると解放される).静的変数は、プログラムの実行中に常に存在するが、その役割ドメイン以外では使用できない.
また,静的記憶方式に属する変数が必ずしも静的変数であるとは限らない.例えば、外部変数(PHPではグローバル変数を指す)は静的記憶方式に属するが、必ずしも静的変数ではなく、staticによって定義されてから静的外部変数、または静的グローバル変数と呼ばれる.
すべてのグローバル変数は静的変数ですが、ローカル変数は定義時にタイプ修飾子staticを付けるだけで、ローカル静的変数になります.
静的変数は、任意の申請可能な場所で申請することができ、申請が成功すると、他の同じ申請を受け入れなくなります.
静的変数は値を変えることができないというわけではなく,値を変えることができない量を定数と呼ぶ.値は可変であり、最新の値が保持されます.静的というのは、関数の呼び出しや終了に伴って変化しないからです.すなわち,前回関数を呼び出したとき,静的変数に値を付与すると,次の関数呼び出しのとき,この値は変わらない.
一、静的局所変数:
1、staticタイプの内部変数はauto自動変数(すなわちstatic宣言を付けていない局所変数)と同様に、ある特定の関数の局所変数であり、すなわち、その変数を定義する関数内でのみ使用でき、両者の作用域は同じである.両者の違いは、auto自動変数は関数が呼び出され、終了するにつれて存在し、消失するが、staticクラスのローカル変数は、その関数が呼び出されるかどうかにかかわらず、ずっと存在することはない.ただし、この変数はまだ存在しますが、使用できません.定義された関数を再度呼び出すと、使用を続行し、前回呼び出された値を保存できます.すなわち、staticタイプの内部変数は、ある特定の関数でしか使用できないが、記憶空間を占有し続ける変数である.
2、関数内で静的変数を定義しながら初期化を行った場合、以降プログラムは初期化操作を行わない(関数内部に現れる基本タイプの静的変数初期化文は、最初の呼び出しでのみ実行される).一方、自動変数の初期値の付与は、関数呼び出し時に行われ、呼び出されるたびに初期値が再付与され、割り当て文が実行されることに相当します.
3、静的ローカル変数の初期化式は、定数または定数式でなければなりません.ローカル静的変数定義時に初期値が付与されていない場合でも、0(数値型変数)または空の文字(文字変数)が自動的に付与されます.静的変数の初期値は0です.自動変数autoでは、初期値を付与しない場合、その値は不確定な値になります.
4、1つの関数を複数回呼び出し、呼び出しの間にある変数の値を保持する必要がある場合、静的ローカル変数を採用することを考慮することができる.グローバル変数を用いても上記の目的を達成できるが、グローバル変数は意外な副作用(主に変数の作用域造問題)をもたらす場合があるため、局所静的変数を用いることが望ましい.
注意:ローカル静的変数はメモリを消費する時間が長く、可読性が悪いため、必要がない限り、ローカル静的変数の使用を最小限に抑えます.
二、静的グローバル変数
グローバル変数(外部変数)の宣言の前にstaticを冠して静的グローバル変数を構成する.
グローバル変数自体が静的記憶方式であり、静的グローバル変数ももちろん静的記憶方式である.
どちらもストレージ方式に違いはありません.
この2つの違いは、
1、非静的グローバル変数の役割ドメインはソースプログラム全体であり、1つのソースプログラムが複数のソースファイルから構成されている場合、非静的グローバル変数は各ソースファイルで有効である.
2、静的グローバル変数は、変数を定義するソースファイル内でのみ有効であり、同じソースプログラムの他のソースファイルでは使用できない役割ドメインを制限します.
以上の分析から明らかなように--
局所変数を静的変数に変更すると,その記憶方式が変化し,すなわち生存期間が変化する.グローバル変数を静的変数に変更すると,その役割ドメインが変更され,その使用範囲が制限される.static静的変数は、スタックに割り当てられるのではなく、プログラムのグローバルストレージ領域(つまり、プログラムのグローバルデータ領域に割り当てられるため、スタックオーバーフローを招くことはありません)に配置され、次の呼び出し時に元の付与値を維持することができます.この点はスタック変数とスタック変数との違いです.
三、PHPに応用する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 //-------------- static -----------
  /** */ function   local() {      $loc   = 0;  // , 0 。      ++ $loc ;      echo   $loc   '
'
; } local();  //1 local();  //1 local();  //1 echo   '===================================
'
;
  /** static */ function   static_local() {      static   $local   = 0 ;  // 0      $local ++;      echo   $local   '
'
; } static_local();  //1 static_local();  //2 static_local();  //3 //echo $local; , , 。 echo   '=======================================
'
;
  /** static ( : , ) */ function   static_global() {      global   $glo // , 0, 0, 0, 1, "static" , .      $glo ++;      echo   $glo   '
'
; } static_global();  //1 static_global();  //2 static_global();  //3 ?>