59519751 发表于 2017-3-21 12:14:29

php的autoload与global

  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的方式。
页: [1]
查看完整版本: php的autoload与global