程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php中global和$GLOBALS區別分析

php中global和$GLOBALS區別分析

編輯:關於PHP編程

有朋友說這兩個其實就是寫法的區別,下面我就來給大家證明一下關於global和$GLOBALS區別用法吧,有需要的朋友可具體參考。

根據官方的解釋是

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文件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved