作成日:2006/05/10
1E.8.4 globalキーワード
関数の内側でグローバル変数をアクセスする場合は、globalキーワードを使ってグローバル変数を宣言します。 PHPでは、このグローバル変数の宣言は、レファレンスを使って実装されています。次の2つの文は同値です。
global $foo; $foo =& $GLOBALS['foo']; // lobal $foo;と同値
従って、PHPのglobal宣言とは、「グローバル変数と同じ名前のエイリアスをローカル変数として定義する事」です。 手短に言うと、global宣言とは、「グローバル変数と同名のローカルエイリアスを作る事」です。
PHPでは、グローバル変数とglobal宣言された(ローカル)変数を同一視してはいけません。 混乱はglobal宣言された(ローカル)変数をunset()したり、別のリファレンスに代入したりする場合に起きます。
global宣言された変数をunset()しても、エイリアス(値と結合している1つのリファレンス)を削除しただけで、 実際の変数は削除されません:
$foo = 'Hello';
foo(); // fooの中で$fooのエイリアスを削除します
echo $foo; // $fooはまだあります
unset($foo); // $fooを削除します
echo $foo; // $fooはもうありません
function foo(){
global $foo;
echo $foo; // 'Hello'を出力します
unset($foo); // $fooのエイリアスを削除します
}
global宣言された変数を別のリファレンスに代入すると、元の値との結合は無くなり、新しい値と結合します:
$ref = 1;
$var = 2;
global_ref();
echo "$var"; // 3を出力します
echo "$ref"; // 1を出力します(グローバル変数$refは変更していまん)
function global_ref() {
global $ref; // $ref =& $GLOBALS["ref"]; と同じ
global $var; // $var =& $GLOBALS["var"]; と同じ
$ref =& $var; // $ref =& $GLOBALS["var"]; と同じ
// グローバル変数$varのローカルエイリアスは2つあります($varと$ref)
$ref = 3;
echo "$ref"; // 3を出力します(ローカル変数$refはグローバル変数$varのエイリアスです)
echo "$var"; // 3を出力します(ローカル変数$varはグローバル変数$varのエイリアスです)
}
クラスのリファレンスをglobal宣言された変数に代入する場合も、同じ事が起きます。
class bar_class{ var $prop = 1; };
new_bar();
echo $bar->prop; // なにも出力されません
function new_bar(){
global $bar; // $bar =& $GLOBALS["bar"]; と同じ
$bar =& new bar_class; // $barは$GLOBALS["bar"]のエイリアスでなくなりました
}
