php 还是引用的问题 进来看看

2015-04-02 01:18:01 +08:00
 yuptyy

$a = [];
$b = &$a;

$a['name'] = ['age' => 12];
$a = &$a['name'];

print_r($b);

$b不是指向了$a么 $a不是又指向了 ['age' => 12]么 那么$b不应该也就是这个值了么 可是为什么
$b = ['name' => ['age] => 12] ??

Help me sos~~~~ (⊙o⊙)

2709 次点击
所在节点    PHP
11 条回复
dearrrfish
2015-04-02 04:35:09 +08:00
$b 指向的 “内存地址” 不会跟 $a的重定义变化而变化。
msg7086
2015-04-02 07:09:24 +08:00
你还是不要这么理解比较好了。
理解成别名吧。

$a = [];
$b = &$a; # b从现在开始就是a的别名了,反过来a也是b的别名了

$a['name'] = ['age' => 12];
$a = &$a['name']; # a从现在开始就是a['name']和b['name']的别名,而不再是b的别名了。

换句话说。并不是b指向了a,而是b和a同时指向了第一行的那个[]。
raincious
2015-04-02 08:04:03 +08:00
@msg7086 +1

其实可以更加形象一些。

刚刚建立 $a 这个变量的时候,它的地址是 1。

$b = &$a; 的时候相当于将 1 赋值给了 $b,所以 $b 看起来和 $a 有一样的数据。

同样的, $a = &$a['name']; 是将地址 11 赋值给了 $a,$a 的引用指向改变了,$b 仍然引用的是原来的引用指向。
zqhong
2015-04-02 08:06:22 +08:00
$a = []; // 假设当前$a指向的内存空间地址为:0x0000 0001
$b = &$a; // $b也指向了$a所在的内存空间地址,这个时候$a、$b指向的地址都是 0x0000 0001

$a['name'] = ['age' => 12]; // $a是一个数组嘛,这里$a数组里面一个叫做“name”的元素,也是一个数组,这个数组的内存空间地址为:0x0000 00002
$a = &$a['name']; // 好像阁下是这里不大理解。在执行这条语句的之前,$a的地址:0x0000 0001,$b的地址:0x0000 00001,这句话的意思就是,$a的地址修改为($a['name'])的地址。执行这条语句之后,$a的地址为:0x0000 0002,$b的地址为:0x0000 0001

print_r($b);

@.@不是很理解这些东西,希望能给阁下一些帮助。
kn007
2015-04-02 08:41:32 +08:00
@msg7086
@raincious
学习了
mcfog
2015-04-02 09:38:30 +08:00
虽然搞懂引用也不坏,但最好的方法还是永远不用,就好像`==`啊`goto`啊之类的东西

语言都是可以裁剪且应当被裁剪的
mclxly
2015-04-02 09:51:47 +08:00
楼主有空看看c语言的指针,就会明白~
yuptyy
2015-04-02 10:44:36 +08:00
@msg7086

$a = [];
$b = &$a;

$a['name'] = [];
$a = &$a['name'];
$a['name'] = [];


那如果在最后加上 $a['name'] = [];

此时$a的地址 已经发生变化 但是$b还是指向原来的[] 那么 修改$a 的内容 $b为什么仍然受到了影响呢
yuptyy
2015-04-02 10:46:43 +08:00
@raincious
$a = [];
$b = &$a;

$a['name'] = [];
$a = &$a['name'];
$a['name'] = [];


那如果在最后加上 $a['name'] = [];

此时$a的地址 已经发生变化 但是$b还是指向原来的[] 那么 修改$a 的内容 $b为什么仍然受到了影响呢
raincious
2015-04-02 13:03:58 +08:00
@yuptyy

$a 和 $b 引用是引用,值是值。是两个独立的变量,互相不会影响,除非直接进行赋值。

$a = []; // 建立一个数组,赋值给 $a
$b = &$a; // 将 $a 的引用(引用地址)赋值给 $b

$a['name'] = []; // 在 $a 建立一个数组,同时在 $a 中建立一个键名为 name 的项
$a = &$a['name']; // 引用刚才建立的那个项,将值赋值给 $a
$a['name'] = []; // 在 $a (现在位于原先的 name 项中) 中建立一个键名为 name 的项。

可见上面并没有更改 $b 的指向,所以他还是指向原先的地方。

如果你目前不太理解这些,建议听从 @mcfog 说的,不要进行复杂的引用操作。等你真正从C学过来了解了指针和引用的思想,自然也就能明白了。
msg7086
2015-04-02 22:23:43 +08:00
@yuptyy a新指向的变量是b的一部分

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX