香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 113|回复: 0

PHP: global 和 $GLOBALS

[复制链接]

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-1-18 17:36:24 | 显示全部楼层 |阅读模式
对于我这个半路出家的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']是访问外部变量本身” 是不是就理解了呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 19:35 , Processed in 0.084850 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表