关于全局变量不能全局的问题
一直以为,全局变量(使用global声明)是在程序的所有地方都可以用的(不然怎么能叫全局?呵),但在最近的工作中,接连碰到几次全局变量无效的郁闷的事,记录一下出现的原因.
1.错误重现
问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立),下面模拟一下:
t1.php
|
以下是代码片段: <?php |
func.php
|
以下是代码片段: <?php |
很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),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)尽量不用全局变量
建议继续学习:
- C语言全局变量那些事儿 (阅读:4385)
- c语言全局变量和局部变量问题汇总 (阅读:3259)
- jRaiser与jQuery的冲突问题 (阅读:2437)
- 排错经历:全局变量被多次析构 (阅读:2431)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:tim 来源: PHPec
- 标签: 全局变量
- 发布时间:2009-10-21 22:14:00
-
[918] WordPress插件开发 -- 在插件使用 -
[134] 解决 nginx 反向代理网页首尾出现神秘字 -
[54] 整理了一份招PHP高级工程师的面试题 -
[52] 海量小文件存储 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] 全站换域名时利用nginx和javascri -
[51] Innodb分表太多或者表分区太多,会导致内 -
[50] 用 Jquery 模拟 select -
[49] CloudSMS:免费匿名的云短信 -
[48] 分享一个JQUERY颜色选择插件
