php不能用地址引用,php 引用遇到的问题

最近遇到这样的问题

$data = [1,2,3];

foreach ($data as &$v){}

foreach ($data as $v){}

print_r($data); //这里输出内容是什么 输出[1,2,2]

第一个foreach

首先理解&,它指向变量的内存地址,可以理解为C语言中的指针。ok ,先看看第一个foreach后,$data的内容

array(3) {

[0]=>

int(1)

[1]=>

int(2)

[2]=>

&int(3)

}

从上面可以看出$data[2]类型&int(3),变成了存储$data[2]的内存指针,由于foreach 结束之后$v并不会马上注销掉的,因此第一次foreach后$v也指向了data[2]的引用

$v = &$data[2]

也就说第一个foreach结束后,$v转变成了内存地址的引用不是简单的变量赋值了。

第二个foreach

foreach ($data as $v){}

//遍历第一个元素

$v = $data[0]; //此时$data[0]的值赋给 $v,而$v指向$data[2]的内存地址会导致$data[2] = $data[0],那么此时的$data为[1,2,1]

//遍历第二个元素

$v = data[1];//同理,此时$data变成了[1,2,2]

//遍历第三个元素

$v = data[2];//同理此时$data变成了[1,2,2]

嗯嗯,看以下代码

$a['a'] = 123;

$b = &$a['a']; //此时的$a['a']为引用类型了

$c = $a;//c['a'] = a['a']也为引用类型

$c['a'] = 456;

print_r($a);//输出456

再看以下代码

$a['a'] = 123;

$b = &$a;

$c = $a;//纯粹的赋值

$c['a'] = 456;

print_r($a);//输出123

思考为什么第一段代码输出456,第二段代码输出123?

答:$b = &$a['a'];与$b = &$a;的区别,前者把数组a的元素变成的引用类型,后者是把a变量变成了引用类型, 所以当执行到$c = $a;赋值运算时,前者的$b会包含引用类型,而后者则是正常的赋值。

总结

在foreach 循环中慎用& ,容易出现意想不到的bug

修改引用类型变量的值,会改变该引用变量所指向的内容

参考资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值