首頁 >後端開發 >php教程 >php中global與$GLOBALS[

php中global與$GLOBALS[

墨辰丷
墨辰丷原創
2018-05-15 17:07:294882瀏覽

這篇文章主要介紹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...
?>

在test函數中$var1和$var2分別是全域變數$var1和$var2的引用(即別名)
$var2 = &$var1; //test函數中的$var2(局部變數)的值更改為該函數內的$var1的引用
此時test函數中$var2的值等於該函數中$var1的值,也等於全域變數中$var1的值,三者指向同一塊記憶體空間,當test函數中的$var2的值改變時,另外兩個(test函數中的$var1和全域變數中的$var1)的值也隨之發生變化。

例3.

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

如同上面所說的,$GLOBALS['var1'] 與全域變數中的$var1是等價的,unset($GLOBALS['var1' ] );等價於將全域變數$var1銷毀,所以印出空
補充:
php中unset()函數是用來銷毀變數的,在很多時候,它只是將變數銷毀,但記憶體裡面的值並沒有銷毀(即unset()函數指數切斷變數與記憶體之間的關係,將變數名稱銷毀,記憶體裡面的值並沒有銷毀,記憶體也沒有釋放),需要注意的是:
1.函數只在變數所佔的記憶體超過256個位元組的時候,才會將記憶體釋放。
2. 只有在所有指向該變數所指向的記憶體的變數(如該變數的所有引用)都被銷毀,位址才會被釋放。

例4.

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

在這段程式碼裡,test()函數中使用global定義的變數其實只是一個指向全域變數$var的引用,在test()函數中銷毀該變數相當於銷毀了全域變數的一個引用(一塊內存,有兩個名字,刪除其中的一個名字,對另一個名字和該記憶體的值並不有影響),所以,當在列印全域變量$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的值
?>
  1. 因為參數為false,所以執行if裡面的語句,將global_references()函數內宣告的原本為全域變數var2引用的var2的值變成var1的引用,所以global_references()函數內印出的兩個變數都是全域變數var1的引用。

  2. 1執行的語句並沒有對全域變數的值產生影響,所以列印的還是程式開始宣告的值。

  3. 因為參數為true,所以執行else裡面的語句,將全域變數var1的值變成全域變數var1的引用(global_references()函數內宣告的var1)的引用,這並沒有改變global_references()中宣告的var2的值(仍為原來記憶體的引用)。

  4. 經過3之後,全域變數var2已經成為全域變數var1的引用了,所以此時兩個全域變數的值都相同。

總結:
global $var : 是指向全域變數$var的一個引用;
$GLOBALS[“var”] : 是全域變數$var本身, 即等價於$var.
前者若是在函數內部宣告的變量,其作用域為該函數,即只在該函數內可見,這個變數是指向全域變數的引用,銷毀該變數並不會對其所指向的全域變數有影響。

相關建議:

PHP讀取外部變數$GLOBALS

PHP json_encode($GLOBALS)出錯的原因

php中的const和global

以上是php中global與$GLOBALS[的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn