码迷,mamicode.com
首页 > Web开发 > 详细

php引用和写时复制

时间:2015-05-01 15:58:48      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

 

php引用和写时复制

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!