析构函数与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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
PHPExcel内存泄漏问题解决方法
Jan 23 PHP
php中使用url传递数组的方法
Feb 11 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
Symfony控制层深入详解
Mar 17 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python中tell()方法的使用详解
2015/05/24 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
上班迟到检讨书
2014/01/10 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
详解非极大值抑制算法之Python实现
2021/06/28 Python