V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiangxihenli
V2EX  ›  PHP

PHP 中 Object 为什么需要自身维护一个 refcount?

  •  
  •   xiangxihenli · 2020-04-02 17:51:26 +08:00 · 3000 次点击
    这是一个创建于 1704 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚刚在看鸟哥的深入理解 PHP7 内核之 OBJECT, 里面提到:

    zend_object(以下简称 object)在 PHP5 中其实是一种相对特殊的存在, 在 PHP5 中,只有 resource 和 object 是引用传递,也就是说在赋值,传递的时候都是传递的本身,也正因为如此,Object 和 Resource 除了使用了 Zval 的引用计数以外,还采用了一套独立自身的计数系统。

    <?php
    $o1 = new Stdclass();
    //o1.refcount == 1, object.refcount == 1
    $o2 = $o1;
    //o1.refcount == o2.refcoun == 2; object.refcount = 1;
    $o3 = &$o2;
    //o3.isref == o2.isref==1
    //o3.refcount == o2.refcount == 2
    //o1.isref == 0; o1.refcount == 1
    //object.refcount == 2
    

    这样,可以让 object 可以保证不同于普通的 zval 的 COW 机制,可以保证 object 可以全局传引用。

    实在没想没白为什么需要自身维护一个计数系统?求大神指点..

    3 条回复    2020-04-03 10:39:47 +08:00
    brzhang
        1
    brzhang  
       2020-04-02 20:50:38 +08:00 via iPhone
    我想到一个理由,为了自动垃圾回收。引用计数的感觉
    xiangxihenli
        2
    xiangxihenli  
    OP
       2020-04-03 07:58:24 +08:00
    @brzhang 嗯?讲讲..我是没有想明白
    zilan
        3
    zilan  
       2020-04-03 10:39:47 +08:00
    为了自动 gc
    $a = new StdClass();
    $b = $a; //此时$b 会引用到$a
    某种情况下 unset($a),但此时$b 还在。需要在 Object 中维护一个引用计数,了解目前自身被引用的数量。
    $a 在 gc 时会计算本身的引用计数,从而确认还有没有别的在用,来确认能不能回收。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:40 · PVG 20:40 · LAX 04:40 · JFK 07:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.