析构函数与php的垃圾回收机制详解


Posted in PHP onOctober 28, 2013

析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。

GC(Garbage Collector)

在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁。

这是PHP的GC(Garbage Collector)垃圾处理机制,防止内存溢出。

当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中的所有对象同样被销毁。

__destruct() 析构函数

__destruct() 析构函数,是在垃圾对象被回收时执行。

析构函数也可以被显式调用,但不要这样去做。

析构函数是由系统自动调用的,不要在程序中调用一个对象的虚构函数。

析构函数不能带有参数。

如下面程序所示,程序结束前,所有对象被销毁。析构函数被调用了。

<? 
class Person { 
    public function __destruct(){ 
        echo '析构函数现在执行了 <br />'; 
        echo '这里一般用来设置、关闭数据库、关闭文件等收尾工作'; 
    } 
} $p = new Person(); 
for($i = 0; $i < 5; $i++){ 
    echo "$i <br />"; 
} 
?>

程序运行结果:




析构函数现在执行了 
这里一般用来设置、关闭数据库、关闭文件等收尾工作

当对象没有指向时,对象被销毁。

<? 
class Person { 
    public function __destruct(){ 
        echo '析构函数现在执行了 <br />'; 
    } 
} $p = new Person(); 
$p = null; // 析构函数在这里执行了 
$p = "abc"; // 一样的效果 
for($i = 0; $i < 5; $i++){ 
    echo "$i <br />"; 
} 
?>

程序运行结果:

析构函数现在执行了 




上面的例子第10行,我们将$p设置为空或者第11行赋予$p一个字符串,这样$p之前指向的对象就成为了垃圾对象。PHP将这个对象垃圾销毁。
php unset变量

<? class Person { 
    public function __destruct(){ 
        echo '析构函数现在执行了 <br />'; 
    } 
} 
$p = new Person(); 
$p1 = $p; 
unset($p); 
echo '现在把 $p 被销毁了,对象是否也被销毁了呢?<br />'; 
for($i = 0; $i < 5; $i++){ 
    echo "$i <br />"; 
} 
echo '现在再把 $p1 也销毁掉,即已经没有指向对象的变量了<br />'; 
unset($p1); // 现在没有指向对象的变量了,析构函数在这里执行了 
?>  
 
程序运行结果:

现在把 $p 被销毁了,对象是否也被销毁了呢?




现在再把 $p1 也销毁掉,即已经没有指向对象的变量了

析构函数现在执行了 

unset 销毁的是指向对象的变量,而不是这个对象。

PHP 相关文章推荐
php MYSQL 数据备份类
Jun 19 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
PHP打开和关闭文件操作函数总结
Nov 18 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
May 06 PHP
解读PHP中上传文件的处理问题
May 29 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 PHP
Laravel框架FormRequest中重写错误处理的方法
Feb 18 PHP
web server使用php生成web页面的三种方法总结
Oct 28 #PHP
php加密解密函数authcode的用法详细解析
Oct 28 #PHP
php 模拟post_验证页面的返回状态(实例讲解)
Oct 28 #PHP
php操作mysqli(示例代码)
Oct 28 #PHP
php session_start()出错原因分析及解决方法
Oct 28 #PHP
php 强制下载文件实现代码
Oct 28 #PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 #PHP
You might like
PHP安全编程之加密功能
2006/10/09 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
办公室文员工作职责
2014/01/31 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
交通工程专业推荐信
2014/09/06 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python