开发一个PHP程序,不可避免的要使用到全局数据.
全局变量便是其中之一,当然这个观点颇具争议,有许多人还是建议禁用全局变量,使用不当对造成程序的可读性很差!结构混乱,调试更是一头雾水,但是不可否认他的便捷,这便是php为什么会用全局变量global原因吧!…
今天就遇到了php 全局变量不起作用的问题.
先上一段简单的代码:
1 | <?php |
2 | $a = 0 ; |
3 | function Test() |
4 | { |
5 | $a =1; |
6 | } |
7 | Test(); |
8 | echo $a ; |
9 | ?> |
上面的代码中输出是0,那是因为函数体Test内$a变量被缺省设置为局部变量,$a的作用域就是在Test内.修改代码如下
01 | <?php |
02 | $a = 0 ; |
03 | function Test() |
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 | function Test_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 | function Test() |
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 | function Test_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 | function Test() |
18 | { |
19 | global $a ; |
20 | $a =1; |
21 | } |
22 | ?> |
2.优秀的访问器
01 | //A.php 文件 |
02 | <?php |
03 | include 'B.php' ; |
04 | $a =0; |
05 | Set_Global( $a ); |
06 | echo $a ; |
07 | ?> |
08 |
09 | //B.php 文件 |
10 |
11 | <?php |
12 | function Set_Global(& $var ) |
13 | { |
14 | $var =1; |
15 | } |
16 | ?> |