有朋友說這兩個其實就是寫法的區別,下面我就來給大家證明一下關於global和$GLOBALS區別用法吧,有需要的朋友可具體參考。
根據官方的解釋是
1.$GLOBALS['var']是外部的全局變量本身。
2.global $var是外部$var的同名引用或者指針。
先看下面的例子:
舉例說明一下:
代碼如下 復制代碼 <?php
正常打印結果為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: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文件。