PHPのグローバル変数は、関数内などで global キーワードを使いますが、PHP公式リファレンスを見てもその正体までは書いてありません。
もうひとつグローバル変数には $GLOBALS がありますが、2つの参照方法ある程度の認識の人も多いでしょう。
globalを使った変数の正体は簡単に証明できます。
かんたんなサンプルコードを作成しました。まずはこれを見てみましょう。
<?php
$g_var = 'sample';
function test(){
global $g_var;
echo 'vars into func: ';
var_dump(get_defined_vars());
echo 'GLOBALS into func: ';
var_dump($GLOBALS);
}
echo 'GLOBALS: ';
var_dump($GLOBALS);
test();
echo 'GLOBALS: ';
var_dump($GLOBALS);
ひとつのグローバル変数($g_var)と簡単な関数(test())を用意します。関数内で global キーワードを使って $g_var を編集できるようにしました。
そして、$GLOBALS の内容を、関数コール前と後、関数内で出力しています。関数内では global $g_var の中身も出力しました。
実行結果はこうなります。
GLOBALS: array(9) {
・
省略
・
["GLOBALS"]=>
array(9) {
・
省略
・
["g_var"]=>
string(6) "sample"
}
["g_var"]=>
string(6) "sample"
}
vars into func: array(1) {
["g_var"]=>
&string(6) "sample"
}
GLOBALS into func: array(9) {
・
省略
・
["GLOBALS"]=>
array(9) {
・
省略
・
["g_var"]=>
&string(6) "sample"
}
["g_var"]=>
&string(6) "sample"
}
GLOBALS: array(9) {
・
省略
・
["GLOBALS"]=>
array(9) {
・
省略
・
["g_var"]=>
string(6) "sample"
}
["g_var"]=>
string(6) "sample"
}
結果を見て何か気づいたでしょうか?
global を使う変数は$GLOBALSのリファレンス
関数内のダンプ内容だけ、"g_var" の変数の型にアンパサンド(&)が付いています。これはリファレンスを表す。
リファレンスはハードリンク(ファイルやディレクトリの)の変数版みたいなもの。
global $g_var は、$GLOBALS['g_var'] を参照しているのと同じことになります。
お察しの通り、global キーワードを使わずに $GLOBALS['g_var'] を直接見ても結果は同じ。
$GLOBALSはスーパーグローバル変数と言って、どこからでも参照できます。
でも、連想配列への参照はかっこ悪いですよね? global キーワードを使ったほうがローカル内でグローバル変数を使ってる感があります。
なぜ関数内だけリファレンスになるかといえば、globalキーワードを付けても、g_var はローカル変数だから。
関数を抜けると、リファレンスとしての g_var は削除されるので、関数前後の$GLOBALSの内容は同じ(&なし)になります。
リファレンスを削除しても元データに影響はありません。ハードリンクを消しても元ファイルは消えないのと同じ。