多くの人は、global と $GLOBALS[] は書き方が違うだけだと思っていますが、そうではありません。
公式の説明によると、
$GLOBALS['var'] は外部グローバル変数 $var そのものです。
global $var は、同じ名前の外部 $var への参照です。
例を挙げてください:
$var1 = 1; $var2 = 2; function test() { $GLOBALS['var2'] = &$GLOBALS['var1']; } test(); echo $var2;
通常の印刷結果は
$var1 = 1; $var2 = 2; function test(){ global $var1, $var2; $var2 = &$var1; echo $var2; $var2 = 'snsgou.com'; } test(); // 输出 1 echo $var2; // 输出 2 echo $var1; // 输出 snsgou.com
test() 関数の $var1 と $va2 はどちらもローカル変数ですが、 global キーワードを追加すると、 $var2 = &$var1; の場合、それぞれグローバル変数 $var1 と $va2 を参照します。変数 $var2 はグローバル変数 $val2 を指しなくなり、グローバル変数 $var1 を再び指すようになります。つまり、ローカル変数 $var2 の変更はグローバル変数 $val2 には影響しませんが、グローバル変数 $val1 を再ポイントします。
別の例を見てみましょう。
$var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1;
$var1 が削除されたため、何も出力されません。ソースプリントを表示しますか?
$var1 = 1; function test(){ global $var1; unset($var1); } test(); echo $var1;
誤って1を印刷してしまいました。
エイリアスのみが削除され、$GLOBALS['var'] の参照はまったく変更されていないことがわかります。
わかりますか?
言い換えると、グローバル $var は実際には $var = &$GLOBALS['var'] です。これは外部変数を呼び出すための単なるエイリアスです。
+++ ディスカッション (2)++++++++++++++++++++++++++++++++++++++++
PHP のglobal と $GLOBALS は書き方が異なるだけでなく、実際のアプリケーションではこの 2 つの違いに注意する必要があります。
まず次の例を見てください:
$id = 1; function test() { global $id; unset($id); } test(); echo($id); // 输出 1
基準位置
多くの PHP 構文構造は参照メカニズムを通じて実装されているため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。参照渡しや参照渡しなどの一部の構造については、すでに上で説明しました。参照を使用する他の構造は次のとおりです:
global $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、次のことを行うのと同じです:
$GLOBALS["var1"] = 1; $var = &$GLOBALS["var1"]; unset($var); echo $GLOBALS['var1']; //输出1 //############################################ $GLOBALS["var1"] = 1; $var = &$GLOBALS["var1"]; unset($GLOBALS['var1']); echo $var; //输出1 //############################################ //如果写成如下,则会出错 $GLOBALS["var"] = 1; $var = &$GLOBALS["var"]; unset($GLOBALS['var']); echo $var; //脚本没法执行 //###########################################
これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。
設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。
isset($var) を使用する場合は false を返します。 $this オブジェクトのメソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。
関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。
これは、$GLOBALS 配列を使用することで回避できます。
関数内でグローバル変数を参照する例:
$var1 = "Example variable"; $var2 = ""; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 = &$var1; // visible only inside the function } else { $GLOBALS["var2"] = &$var1; // visible also in global context } } global_references(false); echo "var2 is set to '$var2' "; // var2 is set to '' global_references(true); echo "var2 is set to '$var2' "; // var2 is set to 'Example variable'
global $var; は、$var = &$GLOBALS['var']; の短縮形と考えてください。したがって、別の参照を $var に割り当てる場合は、ローカル変数への参照のみが変更されます。
前に述べたように、参照はポインタではありません。これは、次の構造では期待される効果が得られないことを意味します:
$bar = 3; function foo(&$var) { $GLOBALS["baz"] = 5; $var = &$GLOBALS["baz"]; } foo($bar); echo $bar;//输出3
これにより、関数の呼び出し時に foo 関数内の $var 変数が $bar にバインドされますが、その後 $GLOBALS["baz"] に再バインドされます。
関数 foo には変数 $bar がないため、参照メカニズムを通じて $bar を関数呼び出しスコープ内の他の変数にバインドすることはできません ($var として表されますが、$var には変数の内容しかありません)。シンボル テーブル内の名前と値のバインディングを呼び出すのではありません)。参照リターンを使用して、関数によって選択された変数を参照できます。
PHP マニュアルの $GLOBALS の説明を引用します:
グローバル変数: $GLOBALS、注: $GLOBALS は PHP 3.0.0 以降のバージョンに適用されます。
定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。これは「スーパーグローバル」、または自動グローバル変数として説明できます。
つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。
関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。
PHP の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているため、global キーワードによって生成される変数は、この規則を確実に回避できません。global は、関数の外部変数を指すエイリアス変数を生成します。関数の実際の外部変数ではありません。エイリアス変数のポインティング アドレスが変更されると、$GLOBALS[] は実際に外部変数と呼ばれ、内部では常に一貫したものになります。そして機能の外。
$a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b;
出力は「3」となります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。
なぜ 2 ではないのでしょうか? $b は関数内で参照によって変更されないことに注意してください。変更された $b は物理メモリの値を指しているため、外部入力は3です。