在PHP中,所有值都保存在所谓的zvals中.这些zvals包含实际的数据,类型信息,这对您的问题很重要 – 引用计数.看看下面的代码段:

$a = new B; // $a points to zval(new B) with refcount=1

$b = $a; // $a, $b point to zval(new B) with refcount=2 (+1)

$c = $b; // $a, $b, $c point to zval(new B) with refcount=3 (+1)

unset($a); // $b, $c point to zval(new B) with refcount=2 (-1)

一旦引用计数到达0,zval将被释放并且对象析构函数被调用.

以下是refcount达到0的示例:

>改变一个变量:

$a = new B; // refcount=1

unset($a); // refcount=0 => __destruct!

但:

$a = new B; // refcount=1

$b = $a; // refcount=2

unset($a); // refcount=1 => no destruct as refcount > 0, even though unset() was called!

>离开函数(或方法)范围

function a() {

$a = new B; // refcount=1

} // refcount=0 => __destruct! (as $a does not exist anymore)

>脚本执行结束

$a = new B; // refcount=1

die(); // refcount=0 => __destruct! (on script execution end all vars are freed)

// doesn't need to be die(), can be just normal execution end

这些显然并不是所有的条件导致了refcount的减少,而是你最常见的那些.

还应该提到,因为PHP 5.3循环引用也会被检测到.因此,如果对象$a引用对象$b和$b引用$a,并且没有任何进一步引用$a或$b,则两者的引用将为1,但它们仍将被释放(和__destructed).在这种情况下,尽管破坏的顺序是未定义的行为.

php 什么时候销毁对象,什么决定什么时候在PHP中销毁类对象?相关推荐

  1. python类定义中、对象字符串的特殊方法是_python中自定义类对象json字符串化的方法_python json转字符串、...

    python中自定义类对象json字符串化的方法 1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): prin ...

  2. Javascript基础与面向对象基础~第四讲 Javascript中的类对象

    今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...

  3. python定义一个dog类 类属性有名字毛色体重_全面了解python中的类,对象,方法,属性...

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  4. C++中的类对象的内存分布以及虚函数表内存分布

    ​ 目录 目录 一.前言 二.C++ 类对象的内存布局 三.函数调用 一.前言 C++的精髓是虚函数.虚函数带来的好处就是:可以定义一个基类的指针,其指向一个继承类,当通过基类的指针去调用函数时,可以 ...

  5. php中的类 对象的方法的区别,php中类和对象的区别是什么

    php中类和对象的区别:类是对象的抽象,对象是类的具体实例:类是抽象的,不占用内存,而对象是具体的,占有内存空间.打个比方:类就是水果,对象就是苹果. 本教程操作环境:windows7系统.PHP7. ...

  6. c++11中static类对象构造函数线程安全

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105113421 s ...

  7. java对象复制到另一个对象中_spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象)...

    spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象) 它的出现原因: BeanUtils提供对Java反射和自省API的包装.其主要目的是利用 ...

  8. 理解Python中的类对象、实例对象、属性、方法

    class Animal(object): # 类对象age = 0 # 公有类属性__like = None # 私有类属性def __init__(self): # 魔法方法self.name = ...

  9. js解析java对象数组_js接收并转化Java中的数组对象的方法

    在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...

  10. java在类中创建一个对象_在另一个类中创建类对象

    我创建了两个类对象,每个对象都有一个构造函数,我试图让一个类对象成为另一个对象中的私有变量 . 这是我想要做的一个简单的例子,而不是实际的类名,而是一个例子 . 有更多的公共和私人变量,但为了简单起见 ...

最新文章

  1. SAP零售:补货 Vs 多步骤补货
  2. 将FeatClass属性表高效率转换成DataTable
  3. Assets.car 桌面解压工具
  4. 【USACO Mar08】 奶牛跑步 A-star k短路
  5. mysql中的触发器
  6. Office协同办公:SkyDrive
  7. Double Free浅析(泄露堆地址的一种方法)
  8. return另外一个用法
  9. php二维数组指定其键名对其排序的方法
  10. Bruce' Tool 4 - autoruns
  11. 接口里面能有构造器吗?_家用弱电箱里空空如也,装修时应该怎么在里面接线呢?能拆掉吗?...
  12. [原]ASP.NET中使用JQUERY-EASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次...
  13. Android 之神 Jake Wharton 从 Square 离职!
  14. 华为服务器修改密码命令,服务器用户名密码修改
  15. [VSX.002]VS开发环境模型
  16. UCOS操作系统——任务管理(一)
  17. 【集训DAY16】ALFA【凸壳】【计算几何】
  18. ORID焦点呈现法(Focused Conversation Method)
  19. ubuntu20.04设置DNS
  20. Vue3 - Suspense 组件介绍及使用方法

热门文章

  1. 迭代反投影法代码_程序员的数学笔记3--迭代法
  2. 数据结构算法 二进制转十进制_数据结构 - 栈
  3. FPGA基础之LUT详解
  4. 怎么写字_写字楼外卖员不让进怎么办?写字楼外卖柜提供解决方案!
  5. android 支付宝 40247,支付宝 app支付异常摘记 -- ALI40247
  6. 四针角oled屏连接arduino_使用Arduino开发板连接OLED显示屏制作一款智能手表
  7. 操作系统原理_读懂操作系统之缓存原理(cache)(三)
  8. Qt数据库sqlite
  9. IntelliJ IDEA 快捷键(一)(window版)
  10. CentOS 6.6 安装pip