$GLOBALS

グローバルスコープで使用可能なすべての変数への参照

説明

スクリプトのグローバルスコープに現在定義されているすべての変数への参照を含む連想配列です。 変数名が配列のキーとなります。

例1 $GLOBALS の例

<?php
function test() {
    
$foo "local variable";

    echo 
'$foo in global scope: ' $GLOBALS["foo"] . "\n";
    echo 
'$foo in current scope: ' $foo "\n";
}

$foo "Example content";
test();
?>

上の例の出力は、 たとえば以下のようになります。

$foo in global scope: Example content
$foo in current scope: local variable

警告

PHP 8.1.0 以降、$GLOBALS 配列全体を書き換える操作はサポートされなくなりました:

例2 $GLOBALS 配列全体を書き換える操作はエラーになる

<?php
 
// 以下は、コンパイル時にエラーが発生します:
 
$GLOBALS = [];
 
$GLOBALS += [];
 
$GLOBALS =& $x;
 
$x =& $GLOBALS;
 unset(
$GLOBALS);
 
array_pop($GLOBALS);
 
// ...上記以外の、$GLOBALS 全体に対するあらゆる書き込み/読み書き操作も同様です
 
?>

注意

注意:

これは 'スーパーグローバル' あるいは自動グローバル変数と呼ばれるものです。 スクリプト全体を通してすべてのスコープで使用することができます。 関数やメソッドの内部で使用する場合にも global $variable; とする必要はありません。

注意: 変数の可用性

他のスーパーグローバル とは異なり、$GLOBALS は PHP で常に使用可能です。

注意:

PHP 8.1.0 以降、$GLOBALS はグローバルなシンボルテーブルの、読み取り専用のコピーになりました。つまり、グローバル変数は $GLOBALS のコピーを通じて書き換えられなくなったということです。 それより前のバージョンでは、 $GLOBALS 配列は値渡しの振る舞いの例外とされ、そのコピーを通じてグローバル変数の書き換えができていました。

<?php
// PHP 8.1.0 より前の振る舞い
$a 1;
$globals $GLOBALS// 建前上は値渡しのコピー
$globals['a'] = 2;
var_dump($a); // int(2)

// PHP 8.1.0 以降の振る舞い
// 以下のようにしても、$a の値は変更されません。以前の振る舞いは、値渡しのセマンティクスに違反していました。
$globals $GLOBALS;
$globals['a'] = 1;

// 以前の振る舞いを復元するには、$GLOBALS 配列のコピーを走査し、個別のキーと値を $GLOBALS 配列に書き戻すようにして下さい。
foreach ($globals as $key => $value) {
    
$GLOBALS[$key] = $value;
}
?>