變量作用域就是一個(gè)變量在頁面與函數(shù)之間可不可以相互使用,它的作用范圍在哪里,下面小編來給大家介紹php變量使用域的一些學(xué)習(xí)筆記拿出來與大家交流一下。
在php當(dāng)中變量的作用范圍php手冊上是這樣描述的
在用戶自定義函數(shù)中,一個(gè)局部函數(shù)范圍將被引入,任何用于函數(shù)內(nèi)部的變量按缺省情況將被限制在局部函數(shù)范圍內(nèi)。例如如下代碼:
這個(gè)腳本不會(huì)有任何輸出,因?yàn)?echo 語句引用了一個(gè)局部版本的變量 $a,而且在這個(gè)范圍內(nèi),它并沒有被賦值。你可能注意到 PHP 的全局變量和 C 語言有一點(diǎn)點(diǎn)不同,在 C 語言中,全局變量在函數(shù)中自動(dòng)生效,除非被局部變量覆蓋,上面開個(gè)頭,下面我來來詳細(xì)介紹
在PHP中變量主要有:內(nèi)置超級(jí)全局變量,一般的變量,常量,全局變量,靜態(tài)變量等.
■內(nèi)置超級(jí)全局變量可以在腳本的任何地方使用和可見。即如果我們在一個(gè)PHP頁面中改變了其中的一個(gè)值,那么在其他PHP頁面中使用時(shí),它的值也會(huì)發(fā)生改變。
■常量一旦被聲明將可以在全局可見,也就是說,它們可以函數(shù)內(nèi)外使用,但是這僅僅限于一個(gè)頁面之中(包含我們通過include和include_once)包含進(jìn)來的PHP腳本,但是在其他的頁面中就不能使用了。
■在一個(gè)腳本中聲明的全局變量在整個(gè)腳本中是可見的,但不是在函數(shù)內(nèi)部,在函數(shù)內(nèi)部的變量如果與全局變量名稱相同,以函數(shù)內(nèi)部的變量為準(zhǔn)。
■函數(shù)內(nèi)部使用的變量聲明為全局變量時(shí),其名稱要與全局變量的名稱一致,在這樣的情況下,我們就可以在函數(shù)中使用函數(shù)外部的全局變量了,這樣就可以避免上一種因?yàn)楹瘮?shù)內(nèi)部的變量與外部的全局變量名稱相同而覆蓋了外部變量這樣的情況。
■在函數(shù)內(nèi)部創(chuàng)建并聲明為靜態(tài)的變量無法在函數(shù)外部可見,但是可以在函數(shù)的多次執(zhí)行過程中保持該值,最常見的情況就是在函數(shù)的遞歸執(zhí)行的過程之中。
■在函數(shù)內(nèi)部創(chuàng)建的變量對(duì)函數(shù)來說是本地的,而當(dāng)函數(shù)終止時(shí),該變量也就不存在了。
超級(jí)全局變量的完整列表如下:
■.$GOBALS 所有全局變量數(shù)組
■.$_SERVER 服務(wù)器環(huán)境變量數(shù)組
■.$_POST 通過POST方法傳遞給該腳本的變量數(shù)組
■.$_GET 通過GET方法傳遞給該腳本的變量數(shù)組
■.$_COOKIE cookie變量數(shù)組
■.$_FILES 與文件上傳相關(guān)的變量數(shù)組
■.$ENV 環(huán)境變量數(shù)組
■.$_REQUEST 所有用戶輸入的變量數(shù)組包括$_GET $_POST $_COOKIE 所包含的輸入內(nèi)容
■.$_SESSION 會(huì)話變量數(shù)組
1、局部變量
在函數(shù)中聲明的變量認(rèn)為是局部變量,即它只能在該函數(shù)中引用,如果在函數(shù)外復(fù)制,講被認(rèn)為是完全不同的另一個(gè)變量(即不同于函數(shù)中所包含的那個(gè)變量)。注意,退出聲明變量的函數(shù)時(shí),變量及其相應(yīng)的值就會(huì)撤銷,代碼如下:
2、函數(shù)參數(shù)
PHP和其他編程語言一樣,任何接受參數(shù)的函數(shù)都必須在函數(shù)首部中聲明這些參數(shù)。雖然這些參數(shù)(值參數(shù))接受函數(shù)外部的值,但退出函數(shù)后就無法再訪問這些參數(shù),代碼如下:
記住,雖然在聲明參數(shù)的函數(shù)內(nèi)部可以訪問和出力這些函數(shù)參數(shù),但當(dāng)函數(shù)執(zhí)行結(jié)束時(shí),參數(shù)就會(huì)撤銷。
3、全局變量
全局變量可以在程序的任何地方訪問。但是,為了修改一個(gè)全局變量,必須要修改該變量的函數(shù)中將其顯式地聲明為全局變量。只要在變量前面加上關(guān)鍵字GLOBAL,就是全局變量。如果將GLOBA關(guān)鍵字放在一個(gè)已有的變量前面,則是告訴PHP姚使用同名的變量。
使用 $GLOBALS 替代 global,代碼如下:
在 $GLOBALS 數(shù)組中,每一個(gè)變量為一個(gè)元素,鍵名對(duì)應(yīng)變量名,值變量的內(nèi)容。$GLOBALS 之所以在全局范圍內(nèi)存在,是因?yàn)?$GLOBALS 是一個(gè)超全局變量。以下范例顯示了超全局變量的用處:
例子 12-3.,演示超全局變量和作用域的例子,代碼如下:
使用靜態(tài)變量
變量范圍的另一個(gè)重要特性是靜態(tài)變量(static variable)。靜態(tài)變量僅在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不丟失??纯聪旅娴睦樱?/p>
例子12-4. 演示需要靜態(tài)變量的例子,代碼如下:
本函數(shù)沒什么用處,因?yàn)槊看握{(diào)用時(shí)都會(huì)將 $a 的值設(shè)為 0 并輸出 "0"。將變量加一的 $a++ 沒有作用,因?yàn)橐坏┩顺霰竞瘮?shù)則變量 $a 就不存在了。要寫一個(gè)不會(huì)丟失本次計(jì)數(shù)值的計(jì)數(shù)函數(shù),要將變量 $a 定義為靜態(tài)的:
例子 12-5,使用靜態(tài)變量的例子:
現(xiàn)在,每次調(diào)用 Test() 函數(shù)都會(huì)輸出 $a 的值并加一。
靜態(tài)變量也提供了一種處理遞歸函數(shù)的方法。遞歸函數(shù)是一種調(diào)用自己的函數(shù)。寫遞歸函數(shù)時(shí)要小心,因?yàn)榭赡軙?huì)無窮遞歸下去。必須確保有充分的方法來中止遞歸。一下這個(gè)簡單的函數(shù)遞歸計(jì)數(shù)到 10,使用靜態(tài)變量 $count 來判斷何時(shí)停止:
例子 12-6,靜態(tài)變量與遞歸函數(shù),代碼如下:
注: 靜態(tài)變量可以按照上面的例子聲明。如果在聲明中用表達(dá)式的結(jié)果對(duì)其賦值會(huì)導(dǎo)致解析錯(cuò)誤。
例子 12-7.聲明靜態(tài)變量,代碼如下:
注意有朋友問我全局靜態(tài)變量 ,在php中沒有全局變量這一說活,php是一種解釋型的語言,雖然有static修飾符,但意思與.Net中的完全不一樣。
即使把類中的一個(gè)變量聲明為static,這個(gè)變量也只在當(dāng)前頁面級(jí)的應(yīng)用程序域中有效。
2、理解變量作用域。
在方法體外聲明的變量,在方法體內(nèi)是訪問不到的。實(shí)例代碼如下:
_DisplayUrl方法是不會(huì)顯示任何結(jié)果,因?yàn)樽兞?url在方法體_DisplayUrl中是無法訪問的,在$url前加上global即可,如DisplayUrl方法。
在方法體中定義的global變量可以在方法體外訪問,代碼如下: