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

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

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

 

PHP语法中有两种赋值方式:引用赋值、非引用赋值。

 

 

<?php 

    $a = 1; 

    $b = $a; // 非引用赋值  

    $c = &$b; // 引用赋值 

<?php

       $a = 1;

       $b = $a; // 非引用赋值

       $c = &$b; // 引用赋值

从表面看,通常会这样认为:“引用赋值就是两个变量对应同一个变量(在C中其实就是一个zval),非引用赋值则是直接产生的一个新的变量(zval),同时将值copy过来”。

这种认为在大部分情况下都是可以想通的。(#1)

 

 

但有些情况下则会显得非常低效,例如:(#2)

 

 

<?php 

function print_arr($arr){//非引用传递  

    print_r($arr); 

 

$test_arr = array( 

        'a' =>   'a', 

        'b' =>   'b', 

        'c' =>   'c', 

        ... 

    );//这里一个比较大的数组  

 

print_arr($test_arr);//第一次调用print_arr函数执行输出  

print_arr($test_arr);//第二次调用print_arr函数执行输出 

<?php

function print_arr($arr){//非引用传递

       print_r($arr);

}

 

$test_arr = array(

              'a'    =>   'a',

              'b'    =>   'b',

              'c'    =>   'c',

              ...

       );//这里一个比较大的数组

 

print_arr($test_arr);//第一次调用print_arr函数执行输出

print_arr($test_arr);//第二次调用print_arr函数执行输出

如果按照上面的理解方式(#1),那么执行两次print_arr,并且是非引用的方式,则会产生两个与$test_arr完全相同的新的变量,那么将是非常低效的。

 

 

实际代码在运行中,并不会产生两个新的变量。因为PHP内核中已经帮助我们进行了优化。

 

 

具体如何实现的呢?这里就要讲到本文的要点:Reference counting & Copy-on-Write,正是采用引用计数、写时复制这两个机制得以优化。

 

 

 

 

 

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

推荐热点

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

豫ICP备11007008号-1