分针网—IT教育: 关于全局变量不能全局的问题
2017-05-03 10:49
337 查看
一直以为,全局变量(使用global声明|)是在程序的所有地方都可以用的,但在最近的工作中,接连碰到几次全局变量无效的郁闷的事,记录一下出现的原因.。
1.错误重现
问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立|),下面模拟一下:
t1.php
以下是代码片段:
<phprun(); //执行function run(){include 'func.php';showGlobal();}?>func.php
以下是代码片段:
<?php$vars = 'I am global!';function showGlobal(){global $vars;print('我使用全局变量:'.$vars);}?>
很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),func.php是定义好的第三方函数,该函数使用了一些全局变量,如果这时把这两个文件放在一起,执行一下t1.php,会发现showGlobal里的$vars是显示不出来的,global失效了?
2.错误原因
搜索后发现,php.net上很早就有人提出过,也有人给出了解释(http://bugs.php.net/bug.php?id=2193):
原来,在t1.php的run函数中include func.php时,func.php中的变量$vars的作用域只是在run之内,而在showGlobal中使用global声明的$vars是要求属于t1.php的不是run函数的,所以为空)
3.解决方法
知道原因后,解决就很简单,可以把include 从run中移出来,这样func.php中的$vars就属于t1.php了;也可以在run里用global声明一下$vars,这样也可以把原来属于run的$vars声明为全局(属于t1.php);
虽然问题可以简决,但用起来还是很不爽, 因为在我的phpec框架中,include的情况比较普遍,不可能把view中按需include的移到外层去,使用global的话,我在使用第三方函数时,又不会也不想去了解它用了什么全局变量,而且,层次结构一多。
总结:
(1)尽量减少多级和函数中include文件;
(2)尽量不用全局变量;
本文转载自分针网
1.错误重现
问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立|),下面模拟一下:
t1.php
以下是代码片段:
<phprun(); //执行function run(){include 'func.php';showGlobal();}?>func.php
以下是代码片段:
<?php$vars = 'I am global!';function showGlobal(){global $vars;print('我使用全局变量:'.$vars);}?>
很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),func.php是定义好的第三方函数,该函数使用了一些全局变量,如果这时把这两个文件放在一起,执行一下t1.php,会发现showGlobal里的$vars是显示不出来的,global失效了?
2.错误原因
搜索后发现,php.net上很早就有人提出过,也有人给出了解释(http://bugs.php.net/bug.php?id=2193):
原来,在t1.php的run函数中include func.php时,func.php中的变量$vars的作用域只是在run之内,而在showGlobal中使用global声明的$vars是要求属于t1.php的不是run函数的,所以为空)
3.解决方法
知道原因后,解决就很简单,可以把include 从run中移出来,这样func.php中的$vars就属于t1.php了;也可以在run里用global声明一下$vars,这样也可以把原来属于run的$vars声明为全局(属于t1.php);
虽然问题可以简决,但用起来还是很不爽, 因为在我的phpec框架中,include的情况比较普遍,不可能把view中按需include的移到外层去,使用global的话,我在使用第三方函数时,又不会也不想去了解它用了什么全局变量,而且,层次结构一多。
总结:
(1)尽量减少多级和函数中include文件;
(2)尽量不用全局变量;
本文转载自分针网
相关文章推荐
- 关于全局变量不能随便定名的问题
- 关于VC单选按钮不能设置变量的问题以及Group属性的设置
- 关于exec中不能有变量运算的问题
- android自定义Application全局变量不能类型转换的问题
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 关于线程并发访问全局变量问题
- 关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 解决skia静态库中关于jpeg/png编码解码器的全局变量的问题
- PHP中关于在函数内引用全局变量的问题
- 关于头文件定义全局变量等问题
- 关于全局变量赋值的问题
- 【经验总结】全局变量在循环中不能赋值的问题
- 关于AIX下的su不能使用环境变量问题的解决
- 关于ucos全局变量定义的问题
- 关于C/C++中全局变量的初始化问题的深入思考
- 一个关于全局变量位置的问题
- PHP中关于在函数内引用全局变量的问题
- 关于VC单选按钮不能设置变量以及Group属性的设置问题
- 关于全局、static对象/变量的初始化问题
- 关于进程和线程对于全局变量共享的问题学习总结