您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > PHP >

PHP源码分析-变量的引用计数、写时复制(Reference counting &amp(3)

来源:未知 责任编辑:责任编辑 发表时间:2014-02-18 03:25 点击:

 

 

 

 

<?php 

$a;//a:refcount=1,is_ref=0, value=NULL;  

$a = 1; //a:refcount=2,is_ref=0, value=1;  

$b = $a;    //a,b:refcount=3,is_ref=0,value=1;  

$c = $a;    //a,b,c:refcount=4,is_ref=0,value=1;  

$d = &$c; //a,b:refcount=3,is_ref=0,value=1;    c,d:refcount=1, is_ref=1, value=1 

<?php

$a;//a:refcount=1,is_ref=0, value=NULL;

$a = 1;    //a:refcount=2,is_ref=0, value=1;

$b = $a;  //a,b:refcount=3,is_ref=0,value=1;

$c = $a;  //a,b,c:refcount=4,is_ref=0,value=1;

$d = &$c; //a,b:refcount=3,is_ref=0,value=1;      c,d:refcount=1, is_ref=1, value=1上面代码的注释,表示当执行这一行后,refcount与is_ref的变化.

 

 

 

 

Copy on Write

 

 

Php变量通过引用计数实现变量共享数据,那如果改变其中一个变量值呢?

 

当试图写入一个变量时,Zend若发现该变量指向的zval被多个变量共享,则为其复制一份ref_count为1的zval,并递减原zval的refcount,这个过程称为“zval分离”。可见,只有在有写操作发生时zend才进行拷贝操作,因此也叫copy-on-write(写时拷贝)

 

对于引用型变量,其要求和非引用型相反,引用赋值的变量间必须是捆绑的,修改一个变量就修改了所有捆绑变量。

 

 

<?php 

    $a=1; 

    $b=$a; 

<?php

       $a=1;

       $b=$a;执行过程中的内存结构图:

 

\

 

 

<?php 

    $a=1; 

    $b=&a; 

<?php

       $a=1;

       $b=&a;执行过程中的内存结构图:

 

\

 

从上可以看到,无论是引用、非引用,这种直接赋值都不会产生新的变量。

只是当是引用时,is_ref设置为1。当非引用时,is_ref设置为0。

读写复制,就是根据is_ref来进行变量分离的。

 

 

 

当is_ref=1时,是引用变量时,执行“引用下的变量分离”

 

 

 

<?php 

    $a = 1; 

    $b = $a; 

    $c = &$b; 

<?php

       $a = 1;

       $b = $a;

       $c = &$b;执行过程中的内存结构图:

 

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • PHP测试
  • 十天学会php之第六天
  • 几种显示数据的方法的比较
  • 使用xmlhttp为网站增加域名查询功能
  • PHP+MYSQL+Javascript数据库查询结果的动态显示
  • 查找数组中指定键名的值
  • 用redis实现跨服务器session
  • 用新浪微博接口发送图片微博失败的原因
  • smarty局部缓存技术[源码分析]
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1