关于php 全局变量的疑惑

查看:82
本文介绍了关于php 全局变量的疑惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

代码直接扑上

$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;声明的只是指向全局变量的引用, 相当于

function global_references($flag)
{
    $var1 = &$GLOBALS['var1'];
    $var2 = &$GLOBALS['var2'];
    if ($flag) {
        $var2 = &$var1; //1
    } else {
        $var2 = '1'; //2
    }
}

这个时候$var1, $var2只是个局部变量, 但是指向全局变量的引用而已.
$var2 = &$var1;执行后, 函数内的$var2和全局变量$var2没什么关系了, 只是名字相同而已.

如果要达到你的预期. 请使用$GLOBALS, 而不是global,这两者并不一样.

这篇关于关于php 全局变量的疑惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆