php對global變量的解析是:Global的作用是定義全局變量,但是這個全局變量不是應用於整個網站,而是應用於當前頁面,包括include或require的所有文件。
例
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b; //在裡面聲明為全局變量
$b = $a + $b;
}
Sum();
echo $b;
?>
結果: 3
如果沒有全局變量global在方法內是不能獲得$a,$b值的,所以在方法裡面想用外面的變量就需要先聲明這個變量為全局變量,這樣就可以使用了
總結:在函數體內定義的PHP Global變量,函數體外可以使用,在函數體外定義的global變量不能在函數體內使用,
$glpbal $a; $a=123; function f() { echo $a; //錯誤, }
再看看下面一例
代碼如下 復制代碼function f()
{
global $a;
$a=123;
}
f();
echo $a; //正確,可以使用
在用戶自定義函數中,一個局部函數范圍將被引入。任何用於函數內部的變量按缺省情況將被限制在局部函數范圍內(包括include 和 require 導入的文件內的變量)!
解釋:A.php文件的內Test_Global是定義好的第三方函數,該函數用include導入了B.php文件內的$a的global全局變量,所以$a被限制在Test_Global局部函數范圍內,所以B.php文件內的$a的作用范圍都在Test_Global內,而不是作用了整個A.php內….
解決方案:
1. 沖出局部函數
//A.php 文件
<?php
function Test_Global()
{
Test();
}
include 'B.php'; //將include 從局部Test_Global函數中移出
$a = 0 ;
Test_Global();
echo $a;
?>
//B.php 文件
<?php
function Test()
{
global $a;
$a =1;
}
?>
2.優秀的訪問器
代碼如下 復制代碼//A.php 文件
<?php
include 'B.php';
$a =0;
Set_Global($a);
echo $a;
?>
//B.php 文件
<?php
function Set_Global(&$var)
{
$var=1;
}
?>
再來看看$GLOBALS[]
代碼如下 復制代碼
$var1 = 1;
$var2 = 2;
function test1(){
$GLOBALS['var2'] = &$GLOBALS['var1'];
}
test1();
echo $var2; //1
$var3 = 1;
$var4 = 2;
function test2(){
global $var3,$var4;
$var4 = &$var3;
}
test2();
echo $var4;
//2 為什麼$var2的打印結果是1,而$var4的打印結果為2呢?其實就是因為$var3的引用指向了$var4的引用地址。$var4的實際值並沒有改變。官方的解釋是:$GLOBALS['var']是外部的全局變量本身,global $var是外部$var的同名引用或者指針。
也許這個例子還不是很清晰,我再引入一個例子:
代碼如下 復制代碼
$var1 = 1;
function test1(){
unset($GLOBALS['var1']);
}
test1();
var_dump($var1); //NULL
$var2 = 1;
function test2(){
global $var2;
unset($var2);
}
test2();
echo $var2; //1 $var1的值被刪除,而$var2的值還存在。這就證明,$var2只是別名引用,本身的值沒有受到任何的改變。也就是說global $var其實就是$var = &$GLOBALS['var'],調用外部變量的一個別名而已!