析构函数与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 什么是PEAR?(第三篇)
Mar 19 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
PHP Cookie学习笔记
Aug 23 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
PHP var关键字相关原理及使用实例解析
Jul 11 PHP
详解PHP用mb_string处理windows中文字符
May 26 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
基于mysql的bbs设计(一)
2006/10/09 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
用PHP制作的意见反馈表源码
2007/03/11 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
ajax 缓存 问题 requestheader
2010/08/01 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
python实现简易动态时钟
2018/11/19 Python
python三方库之requests的快速上手
2019/03/04 Python
python中的数据结构比较
2019/05/13 Python
PyTorch预训练的实现
2019/09/18 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
九年级政治教学反思
2014/02/06 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA