変数の記憶寿命
変数や配列はプログラムが開始してから終了するまで、
値を記憶しているわけではないです。変数を使うときには、
1.値を記憶するためのハコをコンピューターの
メモリ内に準備されます。
2.変数に値を格納、出力したりして利用する。
3.最後にハコが廃棄されることにより、
メモリが別の用途に使われるように戻す。
変数にハコが存在し、値を記憶している時間のことを記憶寿命といいます。
変数がどのような記憶寿命をもつかは、変数を利用する
位置によります。
通常のローカル変数は
1.関数内で宣言されたときに、
変数のハコがメモリ内に準備され
2.関数が終了する際にハコが廃棄されメモリが
別の用途に使われるようになる。
というサイクルです。通常ローカル変数は、利用されてから
関数が終了するまでの間、値を格納することができます。
一方、グローバル変数は、
1.プログラムの本体の処理が始まる前に、
一度だけメモリを確保する
2.プログラム終了時にメモリが解放される。
というサイクルです。グローバル変数はプログラムの
開始から終了まで、ずっと値を格納します。
サンプルコードの実行結果はこちら
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 |
<!doctype html> <html> <head> <meta charset="utf-8"> <title>変数の記憶寿命</title> <link rel="stylesheet" href="../style.css"> </head> <body> <?php $a = 0; for( $i = 0 ; $i < 5 ; $i++ ) func(); function func(){ global $a; $b = 0 ; static $c = 0; echo "<hr>"; echo "変数\$a:{$a}<br>"; echo "変数\$b:{$b}<br>"; echo "変数\$c:{$c}<br>"; $a++; $b++; $c++; } ?> </body> </html> |
func()は、変数$a,$b,$cの値を出力し、インクリメントする関数です。
グローバル変数$aは、プログラム開始から終了まで値を
記憶しているので、1づつ値が増えています。
ローカル変数$bは、関数が呼ばれるたびに最初に0が格納されて、
関数終了時にハコが廃棄されるので、インクリメントしても値は
0のままです。
staticをつけると
通常のローカル変数は関数が終了するまでの記憶寿命しか
もちませんが、ローカル変数にstaticという
キーワードを付けると、グローバル変数と同じ記憶寿命を
もつようになります。こういうローカル変数の事を
静的寿命をもつローカル変数といいます。
上記のサンプルコードの変数$cは静的寿命をもつローカル変数です。
この変数は、グローバル変数と同じようにプログラム開始時に、
初期化され、最後に破棄されます。
func()関数が終了してもハコは廃棄されず、値を保持したままなので、
関数が呼び出されるたびに値がインクリメントされます。
記憶クラス | 記憶寿命 | |
---|---|---|
ローカル変数 | (自動) | 宣言されてから関数が終了するまで(自動) |
static | プログラム実行準備から終了まで(静的) | |
グローバル変数 | プログラム実行準備から終了まで(静的) |
変数の記憶寿命がからむエラー
プログラムを実行してみると、意図しない値が表示されたり、
誤りが起こることがあります。こうした場合、変数のスコープや
記憶寿命が関係していることがあります。