php引用和写时复制
在php变量中已经发现 zval结构体中有refcount__gc(引用个数) 和 is_ref__gc(是否被引用)
例如:
<?php
$a="hello world";
?>
此时PHP会创建一个zval容器 因为这个变量不是一个引用 所以这个容器的is_ref__gc为false 并且refcount__gc为1
再看下面的代码
<?php
$a="hello world";
$b=$a;
?>
这里由于$b并不是引用$a 所以这里的zval容器的is_ref__gc还是为false refcount__gc为2 这里大家肯定会有疑惑了
为什么不是引用refcount__gc还为2呢?这是由于PHP的写时复制机制的原因
<?php
$a="hello world";//此时的refcount__gc为1 is_ref__gc为0
$b=$a;//此时的refcount__gc为2 is_ref__gc为0
$a="change";//此时的refcount__gc为1 is_ref__gc为0
?>
当$a赋值给$b时 $a 的refcount__gc加1 即$a $b是指向同一内存的 当$a发生改变时 refcount__gc变回1 是因为重新创建了一个内存块来保存新的值,这也就是写时复制机制
<?php
$a="hello world";//此时的refcount__gc为1 is_ref__gc为0
$b=&$a;//此时的refcount__gc为2 is_ref__gc为1
$a="change";//此时的refcount__gc为2 is_ref__gc为1
?>
当显示的让一个变量引用另外一个变量时,refcount__gc is_ref__gc都会加1 来看下PHP是如何判断何时复制变量的
如果is_ref__gc有值(不为0)或者refcount__gc <2也就是为1的时候 你去修改这个变量 它就直接返回变量的实体 而不是复制它的值。
如果 is_ref__gc 为2 的情况 修改一个的值 就会改变2个变量的值 因为这2个变量都是指向的一个内存块
如果refcount__gc <2 并且is_ref__gc =0 修改一个的值 只会改变1个变量的值 当然这里也只有一个变量
菜鸟 ,写的不好 勿喷 。只为了以后自己能翻翻怀恋下
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。