php的赋值与引用

针对php的引用,有时总会错误认为指向一块内存,修改也会影响到该内存数据,直到看到php的源码分析,有了更清楚的理解,部分出自< php核心技术和最佳实践 >

写时复制

  • web

    • php变量有is_ref和refcount标志,用来标识是否引用和变量引用次数
  • 当两个变量$a=$b;,虽然不是引用,但是值相同,为了内存复用,$b 的refcount会加1

  • 只有当$b 的值改变,才会新开辟内存写入值,并置refcount为1


    example:在xdebug下打印
          $a='this is a val';
          xdebug_debug_zval('a');
    
          $b=$a;
          xdebug_debug_zval('a');
    
              $a='this is another val';
          xdebug_debug_zval('a');
                      # 结果
          a: (refcount=1, is_ref=0)='this is a val'
          a: (refcount=2, is_ref=0)='this is a val'
          a: (refcount=1, is_ref=0)='this is another val'

    引用

    $a='this is a val';
    xdebug_debug_zval('a');
    $b=&$a;
    xdebug_debug_zval('a');
    xdebug_debug_zval('b');
    unset($b);
    xdebug_debug_zval('a');
    $b='b';
    xdebug_debug_zval('a');
    xdebug_debug_zval('b');
    # 结果
    a: (refcount=1, is_ref=0)='this is a val'
    a: (refcount=2, is_ref=1)='this is a val'
    b: (refcount=2, is_ref=1)='this is a val'
    a: (refcount=1, is_ref=0)='this is a val'
    a: (refcount=1, is_ref=0)='this is a val'
    b: (refcount=1, is_ref=0)='b'
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/03/08/php-assignment-and-reference.html