PHPのグローバルと$GLOBALS[

墨辰丷
墨辰丷オリジナル
2018-05-15 17:07:294910ブラウズ

この記事ではphpにおけるglobalと$GLOBALS[' ']の違いを中心に紹介しますので、興味のある方は参考にしていただければ幸いです。

PHP では global と $GLOBALS[' '] に違いはないと思っていましたが、今日調べてみたところ、両者には大きな違いがあることが分かりました。
global $var: ポイントグローバル変数 $var への参照;
$GLOBALS["var"]: グローバル変数 $var 自体であり、$var と同等です。
例 1:

<?php
    $var1 = 1;    
    $var2 = 2;    
    function test() {
        $GLOBALS[&#39;var2&#39;] = &$GLOBALS[&#39;var1&#39;];
    }
    test();   
    echo $var2;//输出1
?>

test()関数 $GLOBALS[' var2'] は、グローバル変数 $var1 と同等です。

$GLOBALS['var2'] = $GLOBALS['var1'] この関数は、$var2 を $var1 への参照に変更することです。つまり、 $var2 は $var1 のエイリアスであり、両方とも同じメモリ空間を指すため、$var2 の値は 1 になります。

例 2:

<?php
    $var1 = 1;    
    $var2 = 2;    
    function test(){
        global $var1, $var2;        
        $var2 = &$var1;        
        echo $var2;        
        $var2 = &#39;hello...&#39;;
    }
    test(); // 输出 1
    echo $var2; // 输出 2
    echo $var1; // 输出 hello...
?>

テスト関数では、$var1 と $var2 はそれぞれ、テスト内のグローバル変数 $var1 と $var2 への参照 (つまり、エイリアス) です。関数(ローカル変数の値)は関数内の$var1の参照に変更されます。このとき、テスト関数内の$var2の値は関数内の$var1の値と等しくなります。 3 つはグローバル変数の $var1 の値を指し、テスト関数の $var2 の値が変化すると、他の 2 つの値 (テスト関数の $var1 と $)グローバル変数の var1) も変更されます。


例 3.

<?php
    $var1 = 1;    
    function test(){
        unset($GLOBALS[&#39;var1&#39;]);
    }
    test();    
    echo $var1;
?>

前述したように、$GLOBALS['var1'] はグローバル変数の $var1 と同等です。 unset($GLOBALS['var1'] ); は unset($GLOBALS['var1' )] と同等です。 ] ); 変数​​ $var1 が破棄されるため、出力は空になります。

補足:

変数を破棄するには、多くの場合、変数を破棄するだけですが、メモリ内の値は空になります。破壊されない(つまり、unset()関数のインデックスは変数とメモリの関係を切断し、変数名は破壊されず、メモリ内の値は破壊されず、メモリは解放されないことに注意してください)。 :

1. この関数は、変数によって占有されているメモリが 256 バイトを超えた場合にのみ機能し、メモリは解放されます。
2. アドレスは、変数が指すメモリを指すすべての変数 (変数へのすべての参照など) が破棄された場合にのみ解放されます。

例 4.

<?php
    $var1 = 1;    
    function test(){
        global $var1;        
        unset($var1);
    }
    test(); 
    echo $var1; //结果为打印1
?>

このコードでは、test() 関数で global を使用して定義された変数は、実際にはグローバル変数 $var への参照にすぎません。test() 関数で変数を破棄することは、グローバル変数を破棄することと同じです。 (2 つの名前を持つメモリの一部であり、一方の名前を削除しても、もう一方の名前とメモリの値には影響しません)、そのため、グローバル変数 $var を出力しても、結果は 1 のままです。このコードは次のコードに似ています:

<?php
    $var = 1;    
    $var1 = &$var;    
    unset($var1);    
    echo $var;
?>

関数内でグローバル変数を参照する別の例を見てください:

<?php
    $var1 = "我是变量var1的值";    
    $var2 = "我是变量var2的值";    
    function global_references($use_globals) {
        global $var1, $var2;        
        if (!$use_globals) {            
        $var2 = &$var1;            
        echo $var1;            
        echo $var2;            
        echo "<br />";
        } else {            
        $GLOBALS["var2"] = &$var1;            
        echo $var1;            
        echo $var2;            
        echo "<br />";
        }
    }
    global_references(false);
    //1.打印:我是变量var1的值我是变量var1的值
    echo $var1;    
    echo $var2;    
    echo "<br />"; 
    //2.打印:我是变量var1的值我是变量var2的值

    global_references(true); 
    //3.打印:我是变量var1的值我是变量var2的值
    echo $var1;    
    echo $var2;    
    echo "<br />"; 
    //4.打印:我是变量var1的值我是变量var1的值
?>

パラメータが false であるため、if 内のステートメントが実行され、global_references() の var2 の値が関数内で宣言されたグローバル変数 var2 によって元々参照されていたものは、var1 の参照になるため、global_references() 関数で出力される 2 つの変数はグローバル変数 var1 の参照になります。
  1. 1 実行されたステートメントはグローバル変数の値に影響を与えないため、プログラムの先頭で宣言された値が出力されます。
  2. パラメータが true であるため、else のステートメントが実行され、グローバル変数 var1 の値がグローバル変数 var1 (global_references() 関数で宣言された var1) の参照に変更されます。これにより、global_references は変更されません。 () var2 の宣言された値 (元のメモリへの参照のまま)。
  3. 3以降、グローバル変数var2はグローバル変数var1への参照になっているので、この時点で2つのグローバル変数の値は同じになります。
  4. 概要:
  5. global $var: はグローバル変数 $var への参照です;
$GLOBALS["var"]: はグローバル変数 $var 自体であり、前者の場合は $var と同等です。関数内 宣言された変数のスコープは関数です。つまり、この変数はグローバル変数を指す参照であり、その変数が指すグローバル変数には影響しません。


関連する推奨事項:

PHP が外部変数 $GLOBALS を読み取る

PHP json_encode($GLOBALS) エラーの理由

const と php の global

以上がPHPのグローバルと$GLOBALS[の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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