ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP, globalキーワード付き変数は何なのか? $GLOBALS と何が違うのか?

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

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の内容は同じ(&なし)になります。

リファレンスを削除しても元データに影響はありません。ハードリンクを消しても元ファイルは消えないのと同じ。

前の投稿
PHP, クラスオブジェクトのディープコピー。cloneキーワードを付けるだけじゃダメ!
PHP, $GLOBALS の変数への代入は参照型? まるでクラスオブジェクトのような動き。
次の投稿

コメントを残す