ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるglobalと$GLOBALの違いの分析

PHPにおけるglobalと$GLOBALの違いの分析

不言
不言オリジナル
2018-07-18 11:48:474166ブラウズ

global と $GLOBALS[] は書き方が違うだけだと思っている人がほとんどですが、実際はそうではありません。両者の違いを見てみましょう。

公式の説明によると、

$GLOBALS['var'] は外部グローバル変数 $var そのものです。

global $var は、external $var と同じ名前の参照またはポインタです。 (エラー: これはエイリアス参照であり、ポインタではありません!!!)

例を示します:

php $GAOBAL[] の使用法:

01    <?php    
02    $var1 = 1;    
03    $var2 = 2;    
04    function test() {    
05        $GLOBALS[&#39;var2&#39;] = &$GLOBALS[&#39;var1&#39;];    
06    }    
07    
08    test();    
09    echo $var2;    
10    ?>

通常の出力結果は 1 です

php グローバルの使用: test() 関数の

01    <?php    
02    $var1 = 1;    
03    $var2 = 2;    
04    
05    function test(){    
06        global $var1, $var2;    
07        $var2 = &$var1;    
08        echo $var2;    
09        $var2 = &#39;qianyunlai.com&#39;;    
10    }    
11    
12    test(); // 输出 1    
13    echo $var2; // 输出 2    
14    echo $var1; // 输出 qianyunlai.com    
15    ?>

$var1 と $va2 はどちらもローカル変数です。これらは、global キーワードを追加して、グローバル変数 $ を参照するだけです。それぞれ var1、$va2。$var2 = &$var1; の場合、ローカル変数 $var2 はグローバル変数 $val2 をポイントしなくなり、グローバル変数 $var1 にリダイレクトされます。つまり、ローカル変数の変更$var2 は変更されません。その後、グローバル変数 $val2 に影響し、リダイレクトされたグローバル変数 $val1 に影響します。

別の例を見てみましょう。

1    <?php    
2    $var1 = 1;    
3    function test(){    
4        unset($GLOBALS[&#39;var1&#39;]);    
5    }    
6    test();    
7    echo $var1;    
8    ?>

$var1 が削除されたため、何も出力されませんでした。

01    <?php    
02    $var1 = 1;    
03    
04    function test(){    
05        global $var1;    
06        unset($var1);    
07    }    
08    
09    test();    
10    echo $var1;    
11    ?>

誤って印刷してしまいました 1.

これは、エイリアスのみが削除され、$GLOBALS['var'] の参照がまったく変更されていないことを証明します。 ######理解する?

つまり、グローバル $var は実際には $var = &$GLOBALS['var'] になります。これは外部変数を呼び出すための単なるエイリアスです。

PHP の global と $GLOBALS は書き方が異なるだけでなく、この 2 つの違いは依然として非常に大きいため、実際のアプリケーションでは注意する必要があります。

最初に次の例を見てください:

1    <?php    
2    $id = 1;    
3    function test() {    
4        global $id;    
5        unset($id);    
6    }    
7    test();    
8    echo($id); // 输出 1    
9    ?>

参照の位置付け

多くの PHP 構文構造は参照メカニズムを通じて実装されているため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。 。参照渡しや参照渡しなどの一部の構造については、すでに上で説明しました。参照を使用するその他の構造は次のとおりです。

グローバル $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、次のことと同じです。

01    <?php    
02    $GLOBALS["var1"] = 1;    
03    $var = &$GLOBALS["var1"];    
04    unset($var);    
05    echo $GLOBALS[&#39;var1&#39;]; //输出1    
06    //############################################    
07    $GLOBALS["var1"] = 1;    
08    $var = &$GLOBALS["var1"];    
09    unset($GLOBALS[&#39;var1&#39;]);    
10    echo $var; //输出1    
11    //############################################    
12    //如果写成如下,则会出错    
13    $GLOBALS["var"] = 1;    
14    $var = &$GLOBALS["var"];    
15    unset($GLOBALS[&#39;var&#39;]);    
16    echo $var; //脚本没法执行    
17    //###########################################    
18    ?>

これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。

unset は、変数名と変数の内容の間のバインドを解除するだけです。これは、変数の内容が破壊されることを意味するものではありません。

isset($var) を使用する場合は false を返します。 $this オブジェクトのメソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。

関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。

これは、$GLOBALS 配列を使用することで回避できます。

関数内でグローバル変数を参照する例:

01    <?php    
02    $var1 = "Example variable";    
03    $var2 = "";    
04    
05    function global_references($use_globals) {    
06        global $var1, $var2;    
07        if (!$use_globals) {    
08            $var2 = &$var1; // visible only inside the function    
09        } else {    
10            $GLOBALS["var2"] = &$var1; // visible also in global context    
11        }    
12    }    
13    
14    global_references(false);    
15    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;&#39;    
16    global_references(true);    
17    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;Example variable&#39;    
18    ?>

global $var; を $var = &$GLOBALS['var']; の省略形として扱います。したがって、別の参照を $var に割り当てる場合は、ローカル変数への参照のみが変更されます。

前に述べたように、参照はポインタではありません。これは、次の構成では期待される効果が得られないことを意味します:

1    <?php    
2    $bar = 3;    
3    function foo(&$var) {    
4        $GLOBALS["baz"] = 5;    
5        $var = &$GLOBALS["baz"];    
6    }    
7    foo($bar);    
8    echo $bar;//输出3    
9    ?>

これにより、関数の呼び出し時に foo 関数の $var 変数が $bar にバインドされますが、その後 $ に再バインドされます。上のバー $GLOBALS["baz"]。

関数 foo には変数 $bar がないため ($var として表されますが、$var にはシンボル テーブル内の名前と値のバインディングを呼び出さずに、変数の内容を変更します)。参照リターンを使用して、関数によって選択された変数を参照できます。

PHP マニュアルの $GLOBALS の説明を引用します:

グローバル変数: $GLOBALS、注: $GLOBALS は PHP 3.0.0 以降のバージョンに適用されます。

定義されたすべてのグローバル変数で構成される配列。変数名は配列のインデックスです。これは「スーパーグローバル」、または自動グローバル変数として説明できます。

つまり、上記のコードの $var1 と $GLOBALS['var1'] は、2 つの異なる変数ではなく、同じ変数を参照します。

関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。

PHP の関数によって生成される変数は関数のプライベート変数であることは誰もが知っているため、global キーワードによって生成される変数はこの規則から逃れることはできません。global は、外部を指す関数内にエイリアスを生成します。関数の変数です。関数の外部にある実際の変数ではなく、変数です。エイリアス変数のポインティング アドレスが変更されると、予期しない状況が発生します。$GLOBALS[] は確かに外部変数と呼ばれ、常に一貫性を保ちます。機能の内と外。

01    <?php    
02    $a = 1;    
03    $b = 2;    
04    function Sum() {    
05        global $a, $b;    
06        $b = $a + $b;    
07    }    
08    Sum();    
09    echo $b;    
10    ?>

出力は「3」になります。グローバル変数 $a と $b は関数内で宣言されており、任意の変数のすべての参照変数はグローバル変数を指します。

なぜ 2 ではないのでしょうか? 関数の外では影響がありませんか? $b は関数内で参照によって変更されていませんが、変更された $b は物理メモリの値を指していることに注意してください。したがって、外部入力は 3 になります。

関連する推奨事項:

PHP Global 変数と $GLOBALS 変数のスコープと相違点

以上がPHPにおけるglobalと$GLOBALの違いの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。