php

記憶寿命

変数の記憶寿命

変数や配列はプログラムが開始してから終了するまで、
値を記憶しているわけではないです。変数を使うときには、

1.値を記憶するためのハコをコンピューターの
メモリ内に準備されます。

2.変数に値を格納、出力したりして利用する。

3.最後にハコが廃棄されることにより、
メモリが別の用途に使われるように戻す。

変数にハコが存在し、値を記憶している時間のことを記憶寿命といいます。
変数がどのような記憶寿命をもつかは、変数を利用する
位置によります。
通常のローカル変数は


1.関数内で宣言されたときに、
  変数のハコがメモリ内に準備され

2.関数が終了する際にハコが廃棄されメモリが
  別の用途に使われるようになる。

というサイクルです。通常ローカル変数は、利用されてから
関数が終了するまでの間、値を格納することができます。

一方、グローバル変数は、

1.プログラムの本体の処理が始まる前に、
  一度だけメモリを確保する

2.プログラム終了時にメモリが解放される。

というサイクルです。グローバル変数はプログラムの
開始から終了まで、ずっと値を格納します。

サンプルコードの実行結果はこちら

func()は、変数$a,$b,$cの値を出力し、インクリメントする関数です。

グローバル変数$aは、プログラム開始から終了まで値を
記憶しているので、1づつ値が増えています。

ローカル変数$bは、関数が呼ばれるたびに最初に0が格納されて、
関数終了時にハコが廃棄されるので、インクリメントしても値は
0のままです。

staticをつけると

通常のローカル変数は関数が終了するまでの記憶寿命しか
もちませんが、ローカル変数にstaticという
キーワードを付けると、グローバル変数と同じ記憶寿命を
もつようになります。こういうローカル変数の事を
静的寿命をもつローカル変数といいます。

上記のサンプルコードの変数$cは静的寿命をもつローカル変数です。
この変数は、グローバル変数と同じようにプログラム開始時に、
初期化され、最後に破棄されます。

func()関数が終了してもハコは廃棄されず、値を保持したままなので、
関数が呼び出されるたびに値がインクリメントされます。

記憶クラス 記憶寿命
ローカル変数 (自動) 宣言されてから関数が終了するまで(自動)
static プログラム実行準備から終了まで(静的)
グローバル変数 プログラム実行準備から終了まで(静的)

変数の記憶寿命がからむエラー

プログラムを実行してみると、意図しない値が表示されたり、
誤りが起こることがあります。こうした場合、変数のスコープや
記憶寿命が関係していることがあります。

-php
-