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

2020-04-02 17:51:26 +08:00
 xiangxihenli

刚刚在看鸟哥的深入理解 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 可以全局传引用。

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

2815 次点击
所在节点    PHP
3 条回复
brzhang
2020-04-02 20:50:38 +08:00
我想到一个理由,为了自动垃圾回收。引用计数的感觉
xiangxihenli
2020-04-03 07:58:24 +08:00
@brzhang 嗯?讲讲..我是没有想明白
zilan
2020-04-03 10:39:47 +08:00
为了自动 gc
$a = new StdClass();
$b = $a; //此时$b 会引用到$a
某种情况下 unset($a),但此时$b 还在。需要在 Object 中维护一个引用计数,了解目前自身被引用的数量。
$a 在 gc 时会计算本身的引用计数,从而确认还有没有别的在用,来确认能不能回收。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX