php全局变量失效,全局变量,php_关于php 全局变量的疑惑,全局变量,php - phpStudy

关于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当成了字符串?而不是空?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值