Stay hungry, Stay foolish

0%

global和require_once的误用

##需求

test.php里有一个变量$_auth = ‘222’;使其可以在另一个文件index.php里访问

1
2
3
4
5
6
7
8
9
10
11
12
function test(){
require_once 'test.php';
var_dump($_auth);
}
class Test{
static function testRequire(){
require_once 'test.php';
var_dump($_auth);
}
}
test(); //output:222
Test::testRequire(); //output:Undefined variable: _auth

testRequire()方法报错的原因在于:require_once仅包含文件一次,而且在test()函数里包含,$_auth变量的作用域就仅限于函数体内了。

既然有作用域的问题,那么global后又如何呢?修改程序如下(仅添加了一行global $_auth;):

1
2
3
4
5
6
7
8
9
10
11
12
13
function test(){
require_once 'test.php';
var_dump($_auth);
}
class Test{
static function testRequire(){
require_once 'test.php';
global $_auth;
var_dump($_auth);
}
}
test(); //output:222
Test::testRequire(); //output:Null

看来虽然global可以暂时使用外部变量,但是再隔一个函数体的话是不行的。(只能拿屋子外面的东西,而外面其它屋子里的东西就不行了)。有程序为证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$\_auth = '1111';
function test(){
require_once 'test.php';
var_dump($_auth);
}
class Test{
static function testRequire(){
require_once 'test.php';
global $_auth;
var_dump($_auth);
}
}
test(); //output:222
Test::testRequire(); //output:1111

好了,继续看这种问题怎么解决吧:

  1. 换require_once为require

  2. 改所有$_auth为$GLOBALS[‘AUTH‘]

据说打赏我的人,代码没有BUG