php引用和写时复制

时间:2015-05-01 15:58:04   收藏:0   阅读:307

在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个变量的值 当然这里也只有一个变量

 

菜鸟 ,写的不好 勿喷 。只为了以后自己能翻翻怀恋下

 

原文:http://www.cnblogs.com/jjdxqx/p/4470726.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!