代码直接扑上
$var1 = "1";
$var2 = "2";
function global_references($flag)
{
global $var1, $var2;
if ($flag) {
$var2 = &$var1; //1
} else {
$var2 = '1'; //2
}
}
global_references(true);
echo "var2 is set to '$var2'<br/>";
global_references(false);
echo "var2 is set to '$var2'<br/>";
实际结果为
var2 is set to '2'
var2 is set to '1'
按我自己的推理应该是
var2 is set to '1'
var2 is set to '1'
分析
1.既然$var1, $var2 被定义为全局变量,那么在函数global_references() 中 对$var2 = &$var 的修改,在函数定义域之外也能看到。但是第一次打印 $var2 为 2,并没有反映出 对$var2 = &$var 的修改。
2.第二次打印的时候,$var2 为1 ,这说明 在函数定义域之外能反映出 函数global_references() 中 对$var2 = ‘1’ 的修改。这是为什么? 这和第一次打印不是自相矛盾吗??? 我百思不得其解!!!
---------------------------------------分割线--------------------------------------------------
感谢一楼 @church 的答主的详细提示,一开始没有看懂(原谅本人IQ负数)
琢磨之后懂了。
的确如二楼 @MrGeneral 所说,这里面有两个问题( 1.全局变量, 2.引用)
问题一 全局变量
global $var1, $var2; //全局变量声明之后,并不是意味着$var1 和$var2 就变成全局变量了。
全局变量的申明相当于
$var1 = &$GLOBALS['var1']; //$var1, $var2本身并不是全局变量,它们只是引用了全局变量。真正的全局变量是 $GLOBALS['var1'], $GLOBALS['var1']
$var2 = &$GLOBALS['var2'];
问题二 引用
$a = 1;
$b = 2;
$c = &$a; //这个很简单一看就知道,此时$c引用$a,对$c 修改就是对$a修改
//相当于问题中的 $var2 = &$GLOBALS['var2']
$c = &$b; //这一步很关键,这里$c不再引用$a了,更不是 $a引用$b(我当初就是犯了这个错误),这里变成了$c引用$b了,对$c修改就是对$b修改,这时$c和$b没有半毛钱关系了,
//相当于问题中的 $var2 = &$var1 这时并没有使$GLOBALS['var2']引用 $var1,反而是使$var2引用了$GLOBALS['var1'], 也就是说这里并没有改变$GLOBALS['var2']的值,而是改变了 $var2引用的指针。$var2 = &$GLOBALS['var1]
验证
$var1 = "1";
$var2 = "2";
function global_references($flag)
{
global $var1, $var2;
if ($flag) {
$var2 = &$var1; //1
$var2 = '这时修改$var2的值也就是修改$GLOBALS["var1"]';
} else {
$var2 = '1'; //2
}
}
global_references(true);
echo "var2 is set to '$var2'<br/>";
echo "var1 is set to '$var1'<br/>";
打印为
var2 is set to '2'
var1 is set to '这时修改$var2的值也就是修改$GLOBALS["var1"]'
因为
global $var1, $var2;
声明的只是指向全局变量的引用, 相当于这个时候
$var1
,$var2
只是个局部变量, 但是指向全局变量的引用而已.$var2 = &$var1;
执行后, 函数内的$var2
和全局变量$var2
没什么关系了, 只是名字相同而已.如果要达到你的预期. 请使用
$GLOBALS
, 而不是global
,这两者并不一样.