|
对于我这个半路出家的PHP程序猿来说,PHP的global语法总感觉怪怪的。比如说下面这段代码:
$val = 1;
function changeVal(){
$val = 3;
}
changeVal();
echo $val;
我们写了个方法changeVal希望改变$val的值,当然由于作用域的关系,上面的代码并没有输出我们期待的结果。那么如果用 global 来改造这段代码的话,第一反应我们就会写出这样的代码:
global $val;
$val = 1;
function changeVal(){
$val = 3;
}
changeVal();
echo $val;
我们想,将 $val 的作用域变为全局的不就OK了吗,但事实上这段代码还是没有输出我们想要的结果。额... 查下文档吧,当我们想要在方法内部引用一个外部的变量时,我们可以在该方法中通过global来声明这个变量,这样这个变量就可以在这个方法内被访问了。于是我们调整了我们的代码,这次终于输出我们期待已久的结果 3 。
$val = 1;
function changeVal(){
global $val;
$val = 3;
}
changeVal();
echo $val;
这里有个问题我们需要思考一下,global 是改变了 $val 的作用域呢?还是让 $var 通过引用传递到方法内呢?于是我们写段代码测试下吧:
$val = 1;
function changeVal(){
global $val;
$val = 3;
}
function changeVal2(){
//global $val;
$val = 5;
}
changeVal();
changeVal2();
echo $val;
我们发现在 changeVal2 中,不加 global $val; 结果输出3,加上global $val; 结果输出5。这就说明global起到的是参数传递的功能。那么global和$GLOBALS有什么联系吗?我们先将$GLOBALS打印出来看看:
$val = 1;
function changeVal(){
$val = 3;
}
changeVal();
var_dump($GLOBALS);
我们发现$GLOBALS中有个$GLOBALS['val'],于是我们自然的想到将我们的代码改为下面这样,行不行呢?
$val = 1;
function changeVal(){
$GLOBALS['val'] = 3;
}
changeVal();
echo $val;
我们发现也输出了期待的结果3。对比之前的代码,和之前的结论“global起到的是参数传递的功能” 我们得到 global $val; 其实就相当于 $val = &$GLOBALS['val'] 。也就是说global $val是创建了一个外部变量 $val 的同名引用,而$GLOBALS['val']是访问外部变量本身。看下面的例子我们就明白了:
$val = 1;
$val2 = 3;
function changeVal(){
$GLOBALS['val2'] = &$GLOBALS['val'];
}
changeVal();
echo $val2; //输出 1
$val = 1;
$val2 = 3;
function changeVal(){
global $val,$val2;
$val2 = &$val;
}
changeVal();
echo $val2; //输出 3
注意global $val是创建了一个外部变量 $val 的同名引用。将第二段代码 翻译一下就是:
$val = 1;
$val2 = 3;
function changeVal(){
// 为了便于理解我们换个名字
$v1 = &$GLOBALS['val']; // $v1 --> 1; $val --> 1;
$v2 = &$GLOBALS['val2']; // $v2 --> 3; $val2 --> 3;
$v2 = &$v1; // $v2-->1; $v1-->1; $val-->1; $val2 --> 2;
}
changeVal();
echo $val2;
所以最后我们再回过头来看这句话:“global $val是创建了一个外部变量 $val 的同名引用,而$GLOBALS['val']是访问外部变量本身” 是不是就理解了呢? |
|