PHP中$GLOBALS與global的區(qū)別詳解
PHP中$GLOBALS和global都可以實(shí)現(xiàn)全局變量的功能,所以很多人都認(rèn)為global和$GLOBALS[]只是寫(xiě)法上面的差別,其實(shí)不然。$GLOBALS 是一個(gè)超級(jí)全局變量,其實(shí)是一個(gè)數(shù)組,而global 則是一個(gè)聲明全局變量的關(guān)鍵字!
一、超全局變量$GLOBALS
PHP超全局變量有很多,如下的都屬于超全局變量(Superglobal):
$GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV。
官方說(shuō)明:
$GLOBALS — 引用全局作用域中可用的全部變量。
一個(gè)包含了全部變量的全局組合數(shù)組。變量的名字就是數(shù)組的鍵。
即出現(xiàn)過(guò)的全局變量,就可以通過(guò)$GLOBALS這個(gè)數(shù)組取得。
- $GLOBALS['var'] 是外部的全局變量$var本身。
- global $var 是外部$var的同名引用或者指針。(錯(cuò)誤:是個(gè)別名引用而已,非指針?。。。?/li>
PHP生命周期中,定義在函數(shù)體外部的所謂全局變量,函數(shù)內(nèi)部是不能直接獲得的。
$foo="Example content"; test(); function test(){ $foo="local variable"; echo '$foo in current scope: '.$foo."<br>"; echo '$foo in global scope: '.$GLOBALS["foo"]."<br>"; }
如上的例子,要訪問(wèn)外部的$foo必須使用 $GLOBALS 數(shù)組。對(duì)于通過(guò)include文件進(jìn)來(lái)的外部全局變量也適用。
php中g(shù)lobal也有這樣的功能,它和$GLOBALS的區(qū)別在于:
global在函數(shù)產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量,而不是真正的函數(shù)外部變量。
$GLOBALS[]確確實(shí)實(shí)調(diào)用是外部的變量,函數(shù)內(nèi)外會(huì)始終保持一致。
對(duì)于類中的成員變量,類中函數(shù)必須使用$this->的方式訪問(wèn),不能用$GLOBALS方式:
global的作用是定義全局變量,但是這個(gè)全局變量不是應(yīng)用于整個(gè)網(wǎng)站,而是應(yīng)用于當(dāng)前頁(yè)面,包括include或require的所有文件。
二、實(shí)例講解
function t1(){ global $var1,$var2; $var2=&$var1; } function t2(){ $GLOBALS['var3']=&$GLOBALS['var1']; } $var1=5; $var2=$var3=0; t1(); print $var2."\n"; t2(); print $var3."\n";
執(zhí)行結(jié)果為:
0
5
為什么不是2個(gè)5而是1個(gè)0和1個(gè)5呢?再修改一下例子:
function t1(){ global $var1; $var1=2; unset($var1); } function t2(){ $GLOBALS['var1']=3; unset($GLOBALS['var1']); } $var1=1; t1(); print $var1."\n"; t2(); print $var1."\n";
執(zhí)行結(jié)果只輸入一個(gè)2;
1、$GLOBALS是由所有已定義全局變量自動(dòng)形成的數(shù)組。變量名就是該數(shù)組的索引。即$GLOBALS['var1']與函數(shù)外部的變量$var1是同一個(gè)變量,所以將$GLOBALS['var1'] 刪除后,該變量已不存在,所有無(wú)法輸出了。
注:$GLOBALS是自動(dòng)全局變量。這意味著它在所有的腳本中都有效。在函數(shù)或方法中不需要使用 global $GLOBALS;來(lái)訪問(wèn)它。
2、"global $var1;"是產(chǎn)生了函數(shù)外部$var1的別名變量"$var1",它不是真正的函數(shù)外部變量,他只存在于函數(shù)的內(nèi)部,所以即使在函數(shù)內(nèi)將別名變量刪除也不會(huì)影響外面的變量,但是可以修改函數(shù)外部變量的值。
或許有的人總想知道這個(gè)或那個(gè)的區(qū)別:
在php程序,包括其他程序的學(xué)習(xí)中,自己動(dòng)手實(shí)驗(yàn),根據(jù)結(jié)果加上的思考,有的時(shí)候比上網(wǎng)查找可能會(huì)來(lái)得更快一些,更準(zhǔn)確一些。下面我們來(lái)講一下,php在全局范圍內(nèi)訪問(wèn)變量要怎么辦?
例一:global定義全局變量。
function test_global(){ global $var1; $var1='ok'; unset($var1); } test_global(); $var2=&$var1; unset($var1); echo $var2;
先不給出結(jié)果,自己運(yùn)行一下程序。函數(shù)內(nèi)部的變量可以訪問(wèn)到了。從結(jié)果可以看出,unset只是斷開(kāi)變量名與變量值連接,并沒(méi)有馬上銷毀變量的值,而且在函數(shù)內(nèi)部定義的全局變量,實(shí)際在外部只是使用了函數(shù)內(nèi)部的別名而已,所以我們?cè)谕饷嬉廊豢梢栽L問(wèn)$var1。
例二:$GLOBALS在函數(shù)內(nèi)部訪問(wèn)函數(shù)外面定義的變量。
$codetc='out'; function ff(){ echo $GLOBALS['codetc']; } ff();
直接在函數(shù)內(nèi)部使用$codetc是會(huì)出錯(cuò)的。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- PHP超級(jí)全局變量【$GLOBALS,$_SERVER,$_REQUEST等】用法實(shí)例分析
- PHP global全局變量經(jīng)典應(yīng)用與注意事項(xiàng)分析【附$GLOBALS用法對(duì)比】
- PHP中$GLOBALS[''HTTP_RAW_POST_DATA'']和$_POST的區(qū)別分析
- PHP中全局變量global和$GLOBALS[]的區(qū)別分析
- PHP語(yǔ)言中g(shù)lobal和$GLOBALS[]的分析 之二
- php中g(shù)lobal和$GLOBALS[]的分析之一
- PHP全局變量中的global與$GLOBALS的區(qū)別和用法小結(jié)
相關(guān)文章
php求圓周率的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了php求圓周率的簡(jiǎn)單實(shí)現(xiàn)方法,涉及簡(jiǎn)單的php數(shù)學(xué)運(yùn)算技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05使用PHP獲取網(wǎng)絡(luò)文件的實(shí)現(xiàn)代碼
PHP獲取網(wǎng)絡(luò)文件的實(shí)現(xiàn)代碼,其實(shí)就是一個(gè)小偷程序。學(xué)習(xí)php小偷程序的朋友可以參考下。2010-01-01PHP日期時(shí)間函數(shù)的高級(jí)應(yīng)用技巧
PHP的日期時(shí)間函數(shù)date()中介紹了PHP日期時(shí)間函數(shù)的簡(jiǎn)單用法,這類將介紹更多的函數(shù)來(lái)豐富我們的應(yīng)用。2009-05-05php去掉字符串的最后一個(gè)字符附substr()的用法
今天項(xiàng)目中用到,去掉字符串中的最后一個(gè)字符,所以使用了substr,特整理了下,方便需要的朋友學(xué)習(xí)下。2011-03-03php dirname(__FILE__) 獲取當(dāng)前文件的絕對(duì)路徑
dirname(__FILE__) 取到的是當(dāng)前文件的絕對(duì)路徑,也就是說(shuō),比起相對(duì)路徑,查找速度是最快的。2011-06-06PHP實(shí)現(xiàn)數(shù)組的笛卡爾積運(yùn)算示例
這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)組的笛卡爾積運(yùn)算,結(jié)合實(shí)例形式分析了php數(shù)組的笛卡爾積運(yùn)算相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-12-12php基于雙向循環(huán)隊(duì)列實(shí)現(xiàn)歷史記錄的前進(jìn)后退等功能
這篇文章主要介紹了php基于雙向循環(huán)隊(duì)列實(shí)現(xiàn)歷史記錄的前進(jìn)后退等功能,較為詳細(xì)的分析了php使用歷史記錄功能所涉及的相關(guān)技巧與實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08PHP循環(huán)與分支知識(shí)點(diǎn)梳理
涉及到一些比較復(fù)雜的邏輯,分支與循環(huán)是必不可少的。通過(guò)分支和循環(huán)的結(jié)合使用可以使業(yè)務(wù)更加復(fù)雜,代碼功能更加強(qiáng)大,這篇文章主要介紹了PHP循環(huán)與分支知識(shí)點(diǎn)2022-11-11