php中global和$GLOBALS區別分析

來源:互聯網
上載者:User

根據官方的解釋是

1.$GLOBALS['var']是外部的全域變數本身。

2.global $var是外部$var的同名引用或者指標。

先看下面的例子:

舉例說明一下:

 

 代碼如下 複製代碼
    <?php 
    $var1 = 1; 
    $var2 = 2; 
    function test(){ 
         $GLOBALS['var2'] = &$GLOBALS['var1']; 
    } 
    test(); 
    echo $var2; 
    ?> 

正常列印結果為1

 代碼如下 複製代碼


    <?php 
    $var1 = 1; 
    $var2 = 2; 
    function test(){ 
         global $var1,$var2; 
         $var2 = &$var1; 
    } 
    test(); 
    echo $var2; 
    ?> 

 

意外列印結果為2

為什麼會列印結果為2呢?其實就是因為$var1的引用指向了$var2的引用地址。導致實質的值沒有改變


我們都知道PHP中的函數所產生的變數都是函數的私人變數,那麼global產生的變數也確定逃不出這個規矩,為什麼這麼說呢,看下面的代碼:

PHP代碼

 

 代碼如下 複製代碼

function test() {
global $a;
unset($a);
}

$a = 1;
test();
print $a;
?>

履行效果為:
1

為什麼會輸出1呢?不是已經把$a給unset了嗎?unset失靈了?PHP的bug?
都不是,其實unset起作用了,是把test函數中的$a給unset掉了,可以在函數後面參加
print $a;
也就是說global產生 了test函數外部$a的別名 變數“$a”,為了和外面的$a差別
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的實體記憶體地址
所以我們得出一個結論,在函數中global和$GLOBALS[]的差別在於:
global在函數產生一個指向函數外部變數的別名變數,而不是真正的函數外部變數,一但轉變了別名變數的指向地址,就會產生一些意料不到情況,例如例子1.
$GLOBALS[]確確鑿實調用是外部的變數,函數內外會始終維持一致!

可以對照 下面兩個列子:

 代碼如下 複製代碼
global:
function myfunction(){
global $bar;
unset($bar);
}
$bar="someting";
myfunction();
echo $bar;
?>
輸出:someting
$global[]:
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
echo $bar;
?>
輸出:空

PHP 的全域變數和 C 語言有一點點不同,在 C 語言中,全域變數在函數中主動生效,除非被局部變數籠罩。這可能引起一些問題,有些人可能漫不經心的轉變一個全域變數。PHP 中全域變數在函數中應用時必須 申明 為全域。
應用 global的例子

 代碼如下 複製代碼

$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>

以上指令碼的輸出將是 "3"。在函數中申明 了全域變數 $a 和 $b,任何變數的所有引用變數都會指向到全域變數。

我們再來看一個例子吧。

 代碼如下 複製代碼

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

因為$var1被刪除了,所以什麼東西都沒有列印。

 代碼如下 複製代碼

<?php 
    $var1 = 1; 
    function test(){ 
        global  $var1; 
         unset($var1); 
    } 
    test(); 
    echo $var1; 
    ?> 

意外的列印了1。證明刪除的只是別名|引用,起本身的值沒有受到任何的改變。

global問題解析:
question:我在 config.inc.php中定義了一些變數($a),在別的檔案中函數外部 include("config.inc.php"),函數內部需要使用這些變數$a,如果沒有聲明的話,echo $a是列印不出來任何東西的。因此聲明global $a,但是有很多函數和很多變數,總不能不斷重複的這樣聲明吧?有什麼好的解決辦法,請指點。
answer1:先在config.inc.php裡定義常量:define(常量名,常量值)
再在其他需要用到的地方require 'config.inc.php',
然後就能在這個檔案裡直接使用這個常量了。
answer2:我也有個辦法,就是定義數組,如$x[a],$x,那樣就只要聲明global $x一個了。
answer3:我試了你的這個方法,不行啊。
answer4:改你的php.ini檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.