search

Home  >  Q&A  >  body text

php中的可变变量和引用赋值有什么区别

php中的可变变量和引用赋值有什么区别呢,刚开始自学php,麻烦解答一下
除了&这个区别,其他的没什么区别么

阿神阿神2901 days ago438

reply all(3)I'll reply

  • ringa_lee

    ringa_lee2017-04-10 14:55:50

    从PHP内核的角度跟你解释下吧,你可以深入理解下,就完全明白了;
    PHP的变量在内核中都是通过C语言的结构zval来存储的(你没学过C,你可以理解为是个对象,里面的成员变量都是类的属性,暂时先这样理解),zval结构如下:
    struct _zval_struct {
    zvalue_value value; // 存储变量的值
    zend_uint refcount__gc; //表示引用计数 默认为:1
    zend_uchar type; // 变量具体的类型
    zend_uchar is_ref__gc; //表示是否为引用
    };
    举个例子,php代码如下:
    $a = 10;
    $b = $a;
    这时$b没有引用,只是将$a的值赋给了$a,那么zval这个结构中的refcount__gc就变为2了,而is_ref__gc还是false,表示未引用,因为内核$a已经开辟了一块内存空间,当$a赋值给$b时,$b的值只指向了$a,这样就省去了重新开辟一块内存,但是当$b值被改变时($a的值不会变),$b又将会开辟一块新的内存空间,这就是所以的写时复制,到这里,楼主已经明白了,PHP变量在内核中的如何存储了,下面就讲下引用:
    $a = 10;
    $b = &$a;
    这个时候,内核中存储$a的结构is_ref__gc标记为true,代表是引用,那么$a和$b都指向了同一个内存地址,当$b=20的时候,$a也会变成20,说到这里,楼主应该明白区别了吧?

    reply
    0
  • 阿神

    阿神2017-04-10 14:55:50

    变量由创建,引用是别名

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 14:55:50

    变量是完全开了另外一个内存空间存放数据,跟原来的值没有关系了。
    引用是使用了原来的值,如果引用的值改变了,那么原来的值就会改变。
    可以看一下C语言,理解一下引用

    reply
    0
  • Cancelreply