ユーザ定義内で使われた変数は、その関数の中でのみ有効なローカル変数です。
下の例の場合、関数の外で、$moji_1、$moji_2の値は何も入っていないことがわかります。また、php.iniにてNoticeエラーも出力される設定になっている場合は、Notice: Undefined Variable: moji_1 in 「プログラムの位置」が表示され、$moji_1が未設定であるということがわかります。
<?php header("Content-type: text/html; charset=utf-8"); function mymoji(){ $moji_1 = "1"; $moji_2 = "2"; echo $moji_1 . $moji_2; } //12が出力 echo mymoji(); //何も出力されません echo $moji_1 . $moji_2; ?>
<!DOCTYPE HTML> <html lang="ja-JP"> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function mymoji(){ var moji_1 = "1"; var moji_2 = "2"; console.log(moji_1 + moji_2); } //12が出力 mymoji(); //何も出力されません console.log(moji_1 + moji_2); </script> </head> <body> </body> </html>
ただし、ユーザ定義関数内で「global」と宣言された変数は、グローバル変数となり、関数の外でも使えるようになります。
<?php header("Content-type: text/html; charset=utf-8"); function mymoji(){ global $moji_1; global $moji_2; $moji_1 = "1"; $moji_2 = "2"; echo $moji_1 . $moji_2; } //12が出力 echo mymoji(); //12が出力 echo $moji_1 . $moji_2; ?>
<!DOCTYPE HTML> <html lang="ja-JP"> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function mymoji(){ moji_1 = "1"; moji_2 = "2"; console.log(moji_1 + moji_2); } //12が出力 mymoji(); //12が出力 console.log(moji_1 + moji_2); </script> </head> <body> </body> </html>
global宣言と同様の動きをする方法が、スーパーグローバル変数「$GLOBALS」を使う方法です。
変数が$aだとしたとき、$GLOBALS["a"]と記述することにより、その時点の$aは$GLOBALS["a"]としてグローバルスコープを持つことになり、関数の外でもうちでも使うことができるようになります。
<?php header("Content-type: text/html; charset=utf-8"); $a = 10; function keisan_a(){ $GLOBALS["a"] = GLOBALS["a"] + 2; } //12が出力 echo $a; //12が出力 echo $GLOBALS["a"]; ?>
関数内の変数は関数が呼び出されるごとに初期化されます。ただし、staticと宣言された変数は、静的変数となり、関数の実行が終わったあとも値を保持してくれます。
下のような関数の場合、呼び出されるごとに初期化されるので、常に実行結果は5になります。
<?php header("Content-type: text/html; charset=utf-8"); $a = 10; function mysuji(){ $suji_1 = 0; $suji_2 = 5; $suji_1 += $suji_2; echo $suji_1; } mysuji(); //5が出力 mysuji(); //5が出力 mysuji(); //5が出力 ?>$suji_1をstaticをつけて宣言すると、$suji_1は静的変数となり、次の実行の時、前の実行の値を保持します。
<?php header("Content-type: text/html; charset=utf-8"); $a = 10; function mysuji(){ static $suji_1 = 0; $suji_2 = 5; $suji_1 += $suji_2; echo $suji_1; } mysuji(); //5が出力 mysuji(); //10が出力 mysuji(); //15が出力 ?>