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的方式。

你可能感兴趣的:(PHP,框架,Google)