本文共 1336 字,大约阅读时间需要 4 分钟。
loserwn同学最近在测试一个新的东东,发现在一个文件里调用的global变量不起作用:
a.php:
$g_v = 'aa';function g_test(){ var_dump($g_v);}
b.php:
include('a.php');class xxx{ public function run(){ g_test(); //结果是NULL }}
从理论上来讲,a.php中的代码没有任何问题,b.php直接调用的是全局函数,应该也没有问题啊,可是死活就是获取不到全局变量的值,然后在a中调用g_test(),单独运行a.php,没有问题;单独写一个文件include,然后调用g_test(),也没有问题,直接google ”php global“也没有找到有用的信息,后来仔细一想,有可能跟类的autoload有关,又仔细阅读了php关于autoload的手册,在”EXAMPLE“部分看到有人提到这个问题:
”While using an "autoloading" method you should pay attention to variables scope. Because of new file will be included INSIDE of magic function __autoload - all of declared in such file global scope variables will be only available within this function and nowhere else. This will cause strange behaviour in some cases.
“
大意是:当使用autoload方法时,要格外注意变量的作用域。由于新文件是在_autoload函数里进行include,所以include的“新文件”中的“全局变量”就成了__autoload函数的局部变量,只能在__autoload函数作用域内引用。在某种情况下可能会导致一些奇怪的现象。
我们的项目使用了框架,自然会用到autoload,所以也就导致了无法获取global变量的情况,也就是说,实际的代码是:
__autoload(){ inlucde(b.php); --include(a.php); //已经是局部变量 --$g_v = 'aa'; --function g_test(){ -- //全局变量没有$g_v -- global $g_v; -- var_dump($g_v); --} g_test();}
这是一个很麻烦的问题,php官网应该将这个内容加到__autoload或者global的说明文档中,而不是以example的方式。
转载地址:http://oxsni.baihongyu.com/