zoukankan      html  css  js  c++  java
  • PHP

       引用计数以及是否是引用变量,一个神奇的函数,查看当前引用计数:

    1 <?php
    2 xdebug_debug_zval('a');

       以上例程会输出:

    a: (refcount=1, is_ref=0)='new string'

    下面进入正式环节:
    <?php
    $a = "new string";
    $b = $a;
    xdebug_debug_zval( 'a' );
    ?>

    输出: a: (refcount=2, is_ref=0)='new string'

    也就是说当你把一个变量赋值给另外一个变量的时候,实际上并没有复制容器,而是引用赋值。当你真正需要修改的时候,才会复制这个容器。当refcount=0的时候,这个容器也就被删除了,每次unset操作把容器的refcount值减少1。
    类似的,数组和对象也是这个工作原理,他们只不过是一个符合的容器,但是这样
    <?php
    $a = array( 'one' );
    $a[] =& $a;
    xdebug_debug_zval( 'a' );
    ?>
    a: (refcount=2, is_ref=1)=array (
       0 => (refcount=1, is_ref=0)='one',
       1 => (refcount=2, is_ref=1)=...
    )
    
    

        注意到,这里赋值的时候使用了&,否则只是产生一个复合容器的复制品而已。

        这个时候,$a的一个元素竟然指向了本身,这样就产生了循环引用,也就是说如果我们使用unset($a)之后,就没有任何引用指向这个复合容器了,但是它的引用计数仍然是1,而且是一个没有任何办法可以引用到的闭包变量。

        对于,正常的小脚本来说这不算什么,我们不过多了一个结构体存在内存中,脚本终止的时候,也就木有了。但是如果是长时间运行的脚本,如大规模的测试套件,或者是GTK+PHP编写的应用程序,那估计就废了。

    引用计数系统中的同步周期回收(Concurrent Cycle Collection in Reference Counted Systems)
  • 相关阅读:
    mybatis映射文件配置-1对多
    启动服务器加载spring.xml:web.xml配置
    spring-mybatis.xml配置文件
    json转换器映射文件配置
    Restful levels
    事务隔离级别「脏读、不可重复读、幻读」
    Java CDI
    session和Cookie的介绍和应用
    java RE Validation常用
    hello2 source Analysis
  • 原文地址:https://www.cnblogs.com/maxmys/p/3327235.html
Copyright © 2011-2022 走看看