|
1:Global的作用是定義全局變量,但是這個(gè)全局變量不是應(yīng)用于整個(gè)網(wǎng)站,而是應(yīng)用于當(dāng)前頁(yè)面,包括include或require的所有文件。
復(fù)制代碼 代碼如下:
<?php
$a=123;
function aa()
{
Global $a; //如果不把$a定義為global變量,函數(shù)體內(nèi)是不能訪問函數(shù)體外部的$a的,但是可以定義一個(gè)相同的名字$a,此時(shí)這個(gè)變量是局部變量,等同于C語(yǔ)言的局部變量,只能在函數(shù)體內(nèi)部使用。
echo $a;
}
aa();
?>
總結(jié):在函數(shù)體內(nèi)定義的global變量,函數(shù)體外可以使用,在函數(shù)體外定義的global變量不能在函數(shù)體內(nèi)使用,
復(fù)制代碼 代碼如下:
$global $a;
$a=123;
function f()
{
echo $a; //錯(cuò)誤,
}
//再看看下面一例
function f()
{
global $a;
$a=123;
}
f();
echo $a; //正確,可以使用
2:global問題解析:
question:我在 config.inc.php中定義了一些變量($a),在別的文件中函數(shù)外部 include("config.inc.php"),函數(shù)內(nèi)部需要使用這些變量$a,如果沒有聲明的話,echo $a是打印不出來(lái)任何東西的。因此聲明global $a,但是有很多函數(shù)和很多變量,總不能不斷重復(fù)的這樣聲明吧?有什么好的解決辦法,請(qǐng)指點(diǎn)。
answer1:先在config.inc.php里定義常量:define(常量名,常量值)
再在其他需要用到的地方require 'config.inc.php',
然后就能在這個(gè)文件里直接使用這個(gè)常量了。
answer2:我也有個(gè)辦法,就是定義數(shù)組,如$x[a],$x,那樣就只要聲明global $x一個(gè)了。
answer3:我試了你的這個(gè)方法,不行啊。
answer4:改你的php.ini文件。
3.一些Global和$GLOBALS 數(shù)組的例子
例子:使用 global
復(fù)制代碼 代碼如下:
<?php
$w3sky = 1;
$w3sky2 = 2;
function Sum()
{
global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2;
}Sum();
echo $w3sky2;
?>
以上腳本的輸出將是“3”。在函數(shù)中申明了全局變量 $w3sky 和 $w3sky2,任何變量的所有引用變量都會(huì)指向到全局變量。對(duì)于一個(gè)函數(shù)能夠申明的全局變量的最大個(gè)數(shù),php 沒有限制。
在全局范圍內(nèi)訪問變量的第二個(gè)辦法,是用特殊的 php 自定義 $GLOBALS 數(shù)組。前面的例子可以寫成:
例子 使用 $GLOBALS 替代 global
復(fù)制代碼 代碼如下:
<?php
$w3sky = 1;
$w3sky2 = 2;function Sum()
{
$GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2'];
}Sum();
echo $w3sky2;
?>
在 $GLOBALS 數(shù)組中,每一個(gè)變量為一個(gè)元素,鍵名對(duì)應(yīng)變量名,值對(duì)應(yīng)變量的內(nèi)容。$GLOBALS 之所以在全局范圍內(nèi)存在,是因?yàn)?$GLOBALS 是一個(gè)超全局變量。以下范例顯示了超全局變量的用處:
例子 演示超全局變量和作用域的例子
復(fù)制代碼 代碼如下:
<?php
function test_global()
{
// 大多數(shù)的預(yù)定義變量并不 "super",它們需要用 'global' 關(guān)鍵字來(lái)使它們?cè)诤瘮?shù)的本地區(qū)域中有效。
global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何范圍內(nèi)都有效,它們并不需要 'global' 聲明。Superglobals 是在 php 4.1.0 引入的。
echo $_POST['name'];
}
?>
global 也就是說(shuō)在一個(gè)文件里 只要你聲明為global $db 那么在聲明的下面 你就可以引用這個(gè)$db了。
4.原來(lái)以為global和$GLOBALS除了寫法不一樣以為,其他都一樣,可是在實(shí)際應(yīng)用中發(fā)現(xiàn),2者的區(qū)別還是很大的!
先看下面的例子:
復(fù)制代碼 代碼如下:
<?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";
?>
復(fù)制代碼
執(zhí)行結(jié)果為:
0
5
怎么會(huì)這樣呢?不應(yīng)該是2個(gè)5嗎?怎么會(huì)出現(xiàn)1個(gè)0和1個(gè)5呢?
恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
我們都知道變量其實(shí)是相應(yīng)物理內(nèi)存在代碼中的"代號(hào)",假設(shè)我們上面聲明的3個(gè)變量分配的內(nèi)存如下圖表示:
引用php手冊(cè)的$GLOBALS的解釋:
Global 變量:$GLOBALS
注意: $GLOBALS 在 php 3.0.0 及以后版本中適用。
由所有已定義全局變量組成的數(shù)組。變量名就是該數(shù)組的索引。
這是一個(gè)“superglobal”,或者可以描述為自動(dòng)全局變量。
也就是說(shuō)上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個(gè)不同的變量!
下面來(lái)分析global到底做了什么?
我們都知道php中的函數(shù)所產(chǎn)生的變量都是函數(shù)的私有變量,那么global關(guān)鍵字產(chǎn)生的變量也肯定逃不出這個(gè)規(guī)則,為什么這么說(shuō)呢,看下面的代碼:
復(fù)制代碼 代碼如下:
<?php
// 例子2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>
復(fù)制代碼
執(zhí)行結(jié)果為:
1
為什么會(huì)輸出1呢?不是已經(jīng)把$a給unset了嗎?unset失靈了?php的bug?
都不是,其實(shí)unset起作用了,是把test函數(shù)中的$a給unset掉了,可以在函數(shù)后面加入
print $a;
復(fù)制代碼
來(lái)測(cè)試!也就是說(shuō)global產(chǎn)生了test函數(shù)外部$a的別名變量“$a”,為了和外面的$a區(qū)別,我把它成為--test->$a,那么例子1也這么命名的話,可得出下面的圖:
而test_globals執(zhí)行過(guò)以后,看變量的變化:
此時(shí),看圖,就能理解為什么例子1執(zhí)行完以后,$var2是0,而$var3是5了!
所以我們得出一個(gè)結(jié)論,在函數(shù)中g(shù)lobal和$GLOBALS[]的區(qū)別在于:
global在函數(shù)產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量,而不是真正的函數(shù)外部變量,一但改變了別名變量的指向地址,就會(huì)發(fā)生一些意料不到情況(為什么會(huì)打印結(jié)果為2呢?其實(shí)就是因?yàn)?var1的引用指向了$var2的引用地址。導(dǎo)致實(shí)質(zhì)的值沒有改變。這時(shí)候只是指向$var1的指針指向了$var2的指針,只是指針指向變了一下,但是實(shí)質(zhì)上根本就沒有改變$var2的值,因此$var2的值仍舊不會(huì)變化),例如例子1.
$GLOBALS[]確確實(shí)實(shí)調(diào)用是外部的變量,函數(shù)內(nèi)外會(huì)始終保持一致!
注:(接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個(gè)引用賦值運(yùn)算,也就是$var2將指向var1所指向的物理內(nèi)存地址,所以例子1執(zhí)行過(guò)test_global函數(shù)以后,變量的變化只在函數(shù)的局部產(chǎn)生效應(yīng),在函數(shù)外部$var2的指向物理內(nèi)存地址并沒有變化,還是它自己.(重點(diǎn))
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個(gè)引用賦值運(yùn)算,也就是$var2將指向var1所指向的物理內(nèi)存地址,所以例子1執(zhí)行過(guò)test_global函數(shù)以后,變量的變化由下圖可以看出)
這一篇分析的不夠透徹,不明白的請(qǐng)看《global和$GLOBALS[]的分析之二》其中舉一反三通俗易懂
php技術(shù):php中g(shù)lobal和$GLOBALS[]的分析之一,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。