Global,全局變量
PHP Global變量在實際應用中會發現許多問題需要我們不斷的去完善處理。我們在這篇文章中就針對PHP Global變量出現的問題給出了一些具體的解決辦法。
PHP hack的使用技巧詳解
代碼實現PHP GTK寫文本查看器
網站開發中PHP語言優缺點
如何正確實現PHP function函數擴展
PHP error_log()函數處理錯誤日志
1:PHP Global變量的作用是定義全局變量,但是這個全局變量不是應用於整個網站,而是應用於當前頁面,包括include或require的所有文件
代碼如下 復制代碼$a=123;
function aa()
{
Global $a;
//如果不把$a定義為global變量
,函數體內是不能訪問$a的
echo $a;
}
aa();
總結:
在函數體內定義的PHP Global變量,函數體外可以使用,在函數體外定義的global變量不能在函數體內使用,
代碼如下 復制代碼 $glpbal $a;
再看看下面一例
代碼如下 復制代碼
function f()
{
global $a; $a=123;
}
f();
echo $a;
//正確,可以使用
2:PHP 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文件。
設置PHP Global變量 為 on
,下面我們看看復雜點的:
//A.php 文件
<?php
function Test_Global()
{
include 'B.php';
Test();
}
$a = 0 ;
Test_Global();
echo $a;
?>
//B.php 文件
<?php
function Test()
{
global $a;//申明函數體Sum內使用的$a變量為global全局變量
$a =1;
}
?>
為什麼輸出的卻是0?!!
在用戶自定義函數中,一個局部函數范圍將被引入。任何用於函數內部的變量按缺省情況將被限制在局部函數范圍內(包括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;
}
?>
global和$GLOBALS的區別
php中global和$GLOBALS不僅僅是寫法不一樣以為,2者的區別還是很大的,在實際應用中需要注意!
先看下面的例子:
PHP代碼
代碼如下 復制代碼
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 .”n”;
test_globals();
print $var3 .”n”;
?>
執行結果為:
0
5
怎麼會這樣呢?不應該是2個5嗎?怎麼會出現1個0和1個5呢?
恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
我們都知道變量其實是相應物理內存在代碼中的”代號”而已
引用php手冊的$GLOBALS的解釋:
Global 變量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以後版本中適用。
由所有已定義全局變量組成的數組。變量名就是該數組的索引。這是一個“superglobal”,或者可以描述為自動全局變量。
也就是說上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個不同的變量!
下面來分析global到底做了什麼?
引用php手冊的global的解釋:
如果在一個函數內部給一個聲明為 global 的變量賦於一個引用,該引用只在函數內部可見。可以通過使用 $GLOBALS 數組避免這一點。
我們都知道php中的函數所產生的變量都是函數的私有變量,那麼global關鍵字產生的變量也肯定逃不出這個規則,為什麼這麼說呢,看下面的代碼:
PHP代碼
代碼如下 復制代碼
<?php
// 例子2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>
執行結果為:
1
為什麼會輸出1呢?不是已經把$a給unset了嗎?unset失靈了?php的bug?
都不是,其實unset起作用了,是把test函數中的$a給unset掉了,可以在函數test()中加入
print $a;
來測試!
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的物理內存地址,所以例子1執行過test_global函數以後,變量的變化只在函數的局部產生效應,在函數外部$var2的指向物理內存地址並沒有變化,還是它自己.
此時,就能理解為什麼例子1執行完以後,$var2是0,而$var3是5了!
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於:
global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量,一但改變了別名變量的指向地址,就會發生一些意料不到情況,例如例子 1.
$GLOBALS[]確確實實調用是外部的變量,函數內外會始終保持一致
可以對照 下面兩個列子再加深下印象:
global:
代碼如下 復制代碼<?php
function myfunction(){
global $bar;
unset($bar);
}
$bar=”someting”;
myfunction();
echo $bar;
?>
輸出:someting
$GLOBALS[]:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;
?>
輸出:空
當按照上面的思路理解後,碰到下面的情況是不是又有些暈呢?
代碼如下 復制代碼<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
輸出將是 “3″。在函數中申明 了全局變量 $a 和 $b,任何變量的所有引用變量都會指向到全局變量。
怎麼不是2呢,在函數外部不是不影響嗎,請注意$b在函數中並沒有通過引用修改,而是修改的$b指向物理內存的值,因此外部輸入為3。
php中global和$GLOBALS不僅僅是寫法不一樣以為,2者的區別還是很大的,在實際應用中需要注意!
先看下面的例子:
PHP代碼
代碼如下 復制代碼
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 .”n”;
test_globals();
print $var3 .”n”;
?>
執行結果為:
0
5
怎麼會這樣呢?不應該是2個5嗎?怎麼會出現1個0和1個5呢?
恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
我們都知道變量其實是相應物理內存在代碼中的“代號“而已
引用php手冊的$GLOBALS的解釋:
Global 變量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以後版本中適用。
由所有已定義全局變量組成的數組。變量名就是該數組的索引。這是一個“superglobal”,或者可以描述為自動全局變量。
也就是說上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個不同的變量!
下面來分析global到底做了什麼?
引用php手冊的global的解釋:
如果在一個函數內部給一個聲明為 global 的變量賦於一個引用,該引用只在函數內部可見。可以通過使用 $GLOBALS 數組避免這一點。
我們都知道php中的函數所產生的變量都是函數的私有變量,那麼global關鍵字產生的變量也肯定逃不出這個規則,為什麼這麼說呢,看下面的代碼:
PHP代碼
代碼如下 復制代碼<?php
// 例子2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>
執行結果為:
1
為什麼會輸出1呢?不是已經把$a給unset了嗎?unset失靈了?php的bug?
都不是,其實unset起作用了,是把test函數中的$a給unset掉了,可以在函數test()中加入
print $a;
來測試!
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的物理內存地址,所以例子1執行過test_global函數以後,變量的變化只在函數的局部產生效應,在函數外部$var2的指向物理內存地址並沒有變化,還是它自己.
此時,就能理解為什麼例子1執行完以後,$var2是0,而$var3是5了!
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於:
global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量,一但改變了別名變量的指向地址,就會發生一些意料不到情況,例如例子 1.
$GLOBALS[]確確實實調用是外部的變量,函數內外會始終保持一致
可以對照 下面兩個列子再加深下印象:
global:
代碼如下 復制代碼<?php
function myfunction(){
global $bar;
unset($bar);
}
$bar=”someting”;
myfunction();
echo $bar;
?>
輸出:someting
代碼如下 復制代碼
$GLOBALS[]:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;
?>
輸出:空
當按照上面的思路理解後,碰到下面的情況是不是又有些暈呢?
代碼如下 復制代碼<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
輸出將是 “3″。在函數中申明 了全局變量 $a 和 $b,任何變量的所有引用變量都會指向到全局變量。
怎麼不是2呢,在函數外部不是不影響嗎,請注意$b在函數中並沒有通過引用修改,而是修改的$b指向物理內存的值,因此外部輸入為3。