析构函数与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生成WAP页面
Oct 09 PHP
discuz安全提问算法
Jun 06 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
yii2分页之实现跳转到具体某页的实例代码
Jun 02 PHP
php自定义函数实现统计中文字符串长度的方法小结
Apr 15 PHP
php验证码生成器
May 24 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
yii2.0框架场景的简单使用示例
Jan 25 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 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
React 组件间的通信示例
2018/06/14 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
python str与repr的区别
2013/03/23 Python
go和python调用其它程序并得到程序输出
2014/02/10 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python File readlines() 使用方法
2018/03/19 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
python是怎么被发明的
2020/06/15 Python
大一期末自我鉴定
2013/12/13 职场文书
和平主题的演讲稿
2014/01/12 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python