进修PHP垃圾收受接管机制懂得引用计数器的概念

    添加时间:2013-7-3 点击量:

    php变量存在一个叫zval的变量容器中,zval变量容器包含含变量的类型和值,还包含额外的两个字节信息,分别是“is_ref”默示变量是否属于引用,“refcount指向这个zval变量容器的变量个数。


    若是你安装了xdebug,就可以用xdebug_debug_zval()显示“zval”的信息了。如下:



    <?php
    
    ¥str = phpddt.com;
    xdebug_debug_zval(str);


      


    成果:


    str:


    (refcount=1, is_ref=0),


    string phpddt.com (length=10)


    只有当变量容器在”refcount“变成0时就被烧毁.当你unset()一个变量时,想要的“zval”中refcount就会减1,再来说说前几天碰到的unset引用题目:



    <?php
    
    ¥a = aaa;
    ¥b = & ¥a;
    unset(¥a);
    //echo ¥b; //这里依然会输出aaa,用xdebug_debug_zval打印你就知道为什么了
    xdebug_debug_zval(b);


      


    成果:


    b:


    (refcount=1, is_ref=0),string aaa (length=3)


    持续说引用计数器题目,对于array和object合适类型景象又不一样了:



    <?php
    
    / by www.phpddt.com /
    ¥arr = array( a => aaa, b => bbb );
    xdebug_debug_zval( arr );
    ¥arr[aaa] = ¥arr[a];
    xdebug_debug_zval( arr );
    ?>


      


    成果:


    arr:


    (refcount=1, is_ref=0),


    array


      a => (refcount=1, is_ref=0),string aaa (length=3)


      b => (refcount=1, is_ref=0),string bbb (length=3)


    arr:


    (refcount=1, is_ref=0),


    array


      a => (refcount=2, is_ref=0),string aaa (length=3)


      b => (refcount=1, is_ref=0),string bbb (length=3)


      aaa => (refcount=2, is_ref=0),string aaa (length=3)


    可以看到看到原有的数组元素和新添加的数组元素接洽关系到同一个refcount2的zval变量容器.这里我也只是起到抛砖引玉的感化。


    具体关于PHP引用计数器可以参照手册:http://php.net/manual/zh/features.gc.refcounting-basics.php


    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: