php中,由于作用域的限制,导致变量的访问限制:
1、局部作用域内不能访问全局变量
2、全局作用域内不能访问局部变量
对于第一种情况,如下代码将不能正常运行:
";//在局部作用域中访问全局作用域变量 } test(); /* 运行结果: Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 11 a = */?>
那么要想在局部作用域内正常使用全局作用域变量,该怎么做呢?
方法一:在局部作用域内,使用global关键字声明与全局作用域变量名称相同的变量即可。原因:这样声明之后,全局作用域内的变量和局部作用域内与之同名的变量指向了同一块内存。让代码说话:
";//在局部作用域中访问全局作用域变量 $a = 100;//通过内部的$a,来修改$a的值 /* 注意:这么做不会销毁变量,因为此时已经有两个引用指向了这块内容,这么做仅仅是断开了一个引用而已 所以,如果解注释下面一行的代码,运行结果依然正常. */ //unset($a); } test(); echo "在test函数内部修改了\$a的值,此时\$a = $a"; /* 运行结果: a = 1 在test函数内部修改了$a的值,此时$a = 100 */?>
方法二:使用$GLOBALS来访问全局变量。
";//在局部作用域中使用$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']);",程序将无法正常运行。