`

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
5
分享到:
评论
3 楼 silentime 2011-03-30  
bardo 写道
好的程序是没有全局变量的。
因为函数,或对象的方法,就是一个语义,用全局变量,变会使得语义不全。
使用全局变量的原因不外乎:
1、未使用单件模式共享类,或共享函数。
2、缺少中间人,当然,这样的“中间人”角色在设计模式中有很多种。
供参考!


你是从纯面向对象的角度考虑,当然不需要全局变量了,但是对PHP来说,还是需要用全局变量,比如“共享”变量,但是问题也很多,如果只是为了共享一个全局的“只读”变量,还是建议用定义常量的方式。
2 楼 bardo 2011-03-20  
好的程序是没有全局变量的。
因为函数,或对象的方法,就是一个语义,用全局变量,变会使得语义不全。
使用全局变量的原因不外乎:
1、未使用单件模式共享类,或共享函数。
2、缺少中间人,当然,这样的“中间人”角色在设计模式中有很多种。
供参考!
1 楼 loserwn 2011-03-17  
global这个问题困扰了我很久。
看来,还是对autoload理解的不彻底啊。
补充一下:
Yii中的autoload实现是在:
Yii->framework->YiiBase.php中

核心代码是:
public static function autoload($className){} ;
.....
spl_autoload_register(array('YiiBase','autoload'));

相关推荐

Global site tag (gtag.js) - Google Analytics