关于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'
";
global_references(false);
echo "var2 is set to '$var2'
";
实际结果为
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'
";
echo "var1 is set to '$var1'
";
打印为
var2 is set to '2'
var1 is set to '这时修改$var2的值也就是修改$GLOBALS["var1"]'
相关阅读:
java的单例模式的一个问题
使用python numpy模块导入csv文件失败?
Could not find a storyboard named 'main' in bundle NSBundle
windows 下vagrant 能ping通但是无法在浏览器中进行访问
鼠标经过 选中td中的文字这个效果怎么做??
python怎么修改内置类?
关于任意2个配对求和算法求教
如何查询当前Forge Viewer 存在的版本号?
react+webapck 关于大型项目的配置
高并发写入和更新mysql
node中使用mssql模板作为DB连接,如何才能多条件查询并一起返回呢?
vue-cli 运行npm run unit 时报错
Typecho分类循环里调用分类下面的文章如何解决
python字符串用十六进制表示
字符串与二进制串的相互转换
页面刷新和页面重新打开有什么区别?如何让页面刷新的时候和页面重新打开一样,仅仅清缓存可以吗?
javascript Object.prototype 扩展问题
webpack 编译iconfont svg是报错了
Fragment 页显示顶部导航多页面效果
Java的string初始化为null,为什么把null当成了字符串?而不是空?