php中,由於作用域的限制,導致變量的訪問限制:
1、局部作用域內不能訪問全局變量
2、全局作用域內不能訪問局部變量
對於第一種情況,如下代碼將不能正常運行:
<?php //局部作用域(函數內)使用全局變量 $a = 1;//在全局作用域內的變量 function test() { echo "a = {$a}<br />";//在局部作用域中訪問全局作用域變量 } test(); /* 運行結果: Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 11 a = */ ?>
那么要想在局部作用域內正常使用全局作用域變量,該怎么做呢?
方法一:在局部作用域內,使用global關鍵字聲明與全局作用域變量名稱相同的變量即可。原因:這樣聲明之后,全局作用域內的變量和局部作用域內與之同名的變量指向了同一塊內存。讓代碼說話:
<?php //局部作用域(函數內)使用全局變量 $a = 1;//在全局作用域內的變量(暫時稱之為“外部的$a”) function test() { /* 為了使用外部的$a,在此處通過global關鍵字聲明一個與之名稱相同的 變量“$a”(暫時稱之為“內部的$a”),這兩個變量指向同一塊內容,顧可以在局部作用域內正常使用和修改。 */ global $a;//如果不聲明,將不能正常使用外部的$a echo "a = {$a}<br />";//在局部作用域中訪問全局作用域變量 $a = 100;//通過內部的$a,來修改$a的值
/*
注意:這么做不會銷毀變量,因為此時已經有兩個引用指向了這塊內容,這么做僅僅是斷開了一個引用而已
所以,如果解注釋下面一行的代碼,運行結果依然正常.
*/
//unset($a);
} test(); echo "在test函數內部修改了\$a的值,此時\$a = $a"; /* 運行結果: a = 1 在test函數內部修改了$a的值,此時$a = 100 */ ?>
方法二:使用$GLOBALS來訪問全局變量。
<?php //局部作用域(函數內)使用全局變量 $a = 1;//在全局作用域內的變量 function test() { /* 使用$GLOBALS來訪問$a的值:$GLOBALS對全局變量的使用,可以看做是全局變量的 另一種語法形式,而不是“引用”關系 */ echo "a = {$GLOBALS['a']}<br />";//在局部作用域中使用$GLOBALS訪問全局作用變量 $GLOBALS['a'] = 100;//通過$GLOBALS['a'],來修改$a的值 /* 由於$GLOBALS['a']僅僅是全局變量$a的另一種語法形式,所以使用$GLOBALS['a']並不會 建立新的引用,所以如果調用了下面的代碼,程序將不能正常運行,輸出結果: a = 1 Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 21 在test函數內部修改了$a的值,此時$a = */ //unset($GLOBALS['a']); } test(); echo "在test函數內部修改了\$a的值,此時\$a = $a"; /* 運行結果: a = 1 在test函數內部修改了$a的值,此時$a = 100 */ ?>
注意:
通過方法一來使用全局變量$a,實際上是建立了一個新的引用,所以如果使用unset($a),這個時候是不會銷毀變量的。如果將方法一代碼的"//unset($a);"解注釋后運行,仍然能輸出正確的結果。但是$GLOBALS['a']僅僅是是全局變量的的另一種語法形式,並沒有建立新的引用,所以,如果解注釋方法二中的"//unset($GLOBALS['a']);",程序將無法正常運行。