关于php 全局变量的疑惑

发布于 2022-09-04 08:44:42 字数 2344 浏览 35 评论 0

代码直接扑上

$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"]'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三人与歌 2022-09-11 08:44:42

因为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,这两者并不一样.

野侃 2022-09-11 08:44:42

其实是俩个问题。

1.引用
2.全局变量

引用不是指针!

如果在一个函数内部给一个global的变量赋值为一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

$GLOBALS["var2"] = &$var1;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文