V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuptyy
V2EX  ›  PHP

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

  •  
  •   yuptyy · 2015-04-02 01:18:01 +08:00 · 2697 次点击
    这是一个创建于 3510 天前的主题,其中的信息可能已经有所发展或是发生改变。

    $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⊙)

    11 条回复    2015-04-02 22:23:43 +08:00
    dearrrfish
        1
    dearrrfish  
       2015-04-02 04:35:09 +08:00   ❤️ 1
    $b 指向的 “内存地址” 不会跟 $a的重定义变化而变化。
    msg7086
        2
    msg7086  
       2015-04-02 07:09:24 +08:00   ❤️ 2
    你还是不要这么理解比较好了。
    理解成别名吧。

    $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
        3
    raincious  
       2015-04-02 08:04:03 +08:00   ❤️ 2
    @msg7086 +1

    其实可以更加形象一些。

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

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

    同样的, $a = &$a['name']; 是将地址 11 赋值给了 $a,$a 的引用指向改变了,$b 仍然引用的是原来的引用指向。
    zqhong
        4
    zqhong  
       2015-04-02 08:06:22 +08:00   ❤️ 1
    $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
        5
    kn007  
       2015-04-02 08:41:32 +08:00   ❤️ 1
    @msg7086
    @raincious
    学习了
    mcfog
        6
    mcfog  
       2015-04-02 09:38:30 +08:00   ❤️ 2
    虽然搞懂引用也不坏,但最好的方法还是永远不用,就好像`==`啊`goto`啊之类的东西

    语言都是可以裁剪且应当被裁剪的
    mclxly
        7
    mclxly  
       2015-04-02 09:51:47 +08:00
    楼主有空看看c语言的指针,就会明白~
    yuptyy
        8
    yuptyy  
    OP
       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
        9
    yuptyy  
    OP
       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
        10
    raincious  
       2015-04-02 13:03:58 +08:00   ❤️ 1
    @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
        11
    msg7086  
       2015-04-02 22:23:43 +08:00 via iPhone   ❤️ 1
    @yuptyy a新指向的变量是b的一部分
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:46 · PVG 00:46 · LAX 08:46 · JFK 11:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.