针对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