开发一个PHP程序,不可避免的要使用到全局数据.
全局变量便是其中之一,当然这个观点颇具争议,有许多人还是建议禁用全局变量,使用不当对造成程序的可读性很差!结构混乱,调试更是一头雾水,但是不可否认他的便捷,这便是php为什么会用全局变量global原因吧!…
今天就遇到了php 全局变量不起作用的问题.
先上一段简单的代码:
| 1 | <?php | 
| 2 | $a= 0 ; | 
| 3 | functionTest() | 
| 4 | { | 
| 5 | $a=1; | 
| 6 | } | 
| 7 | Test(); | 
| 8 | echo$a; | 
| 9 | ?> | 
上面的代码中输出是0,那是因为函数体Test内$a变量被缺省设置为局部变量,$a的作用域就是在Test内.修改代码如下
| 01 | <?php | 
| 02 | $a= 0 ; | 
| 03 | functionTest() | 
| 04 | { | 
| 05 |  global$a;//申明函数体Test内使用的$a变量为global全局变量 | 
| 06 |  $a=1; | 
| 07 | } | 
| 08 | Test(); | 
| 09 | echo$a; | 
| 10 | ?> | 
申明函数体Test内使用的$a变量为global全局变量后,使得$a的作用全局,所以输出为1.
上面的实例只是基本的global全局变量知识,下面我们看看复杂点的:
| 01 | //A.php 文件 | 
| 02 | 
| 03 | <?php | 
| 04 | functionTest_Global() | 
| 05 | {   | 
| 06 | include'B.php';   | 
| 07 | Test();   | 
| 08 | }   | 
| 09 | 
| 10 | $a= 0 ; | 
| 11 | Test_Global(); | 
| 12 | echo$a; | 
| 13 | ?>  | 
| 14 | 
| 15 | //B.php 文件 | 
| 16 | 
| 17 | <?php | 
| 18 | functionTest() | 
| 19 | { | 
| 20 |  global$a;//申明函数体Sum内使用的$a变量为global全局变量 | 
| 21 |  $a=1; | 
| 22 | } | 
| 23 | ?> | 
为什么输出的却是0?!!
在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括include 和 require 导入的文件内的变量)!
解释:A.php文件的内Test_Global是定义好的第三方函数,该函数用include导入了B.php文件内的$a的global全局变量,所以$a被限制在Test_Global局部函数范围内,所以B.php文件内的$a的作用范围都在Test_Global内,而不是作用了整个A.php内….
解决方案:
1. 冲出局部函数
| 01 |  //A.php 文件 | 
| 02 | 
| 03 | <?php | 
| 04 | functionTest_Global() | 
| 05 | {   | 
| 06 | Test();   | 
| 07 | }   | 
| 08 | include'B.php';  //将include 从局部Test_Global函数中移出 | 
| 09 | $a= 0 ; | 
| 10 | Test_Global(); | 
| 11 | echo$a; | 
| 12 | ?>  | 
| 13 | 
| 14 | //B.php 文件 | 
| 15 | 
| 16 | <?php | 
| 17 | functionTest() | 
| 18 | { | 
| 19 |  global$a; | 
| 20 |  $a=1; | 
| 21 | } | 
| 22 |  ?> | 
2.优秀的访问器
| 1 |  //A.php 文件 | 
| 01 | <?php | 
| 02 | include'B.php';  | 
| 03 | $a=0; | 
| 04 | Set_Global($a); | 
| 05 | echo$a; | 
| 06 | ?>  | 
| 07 | 
| 08 | //B.php 文件 | 
| 09 | 
| 10 | <?php | 
| 11 | functionSet_Global(&$var) | 
| 12 | { | 
| 13 |    $var=1; | 
| 14 | } | 
| 15 |  ?> |