析构函数与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 相关文章推荐
第1次亲密接触PHP5(1)
Oct 09 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
一个PHP的ZIP压缩类分享
May 04 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
[原创]php获取数组中键值最大数组项的索引值
Mar 17 PHP
php中switch语句用法详解
Aug 17 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
如何离线执行php任务
Feb 21 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
thinkphp5实现无限级分类
Feb 18 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 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
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
Python跳出循环语句continue与break的区别
2014/08/25 Python
python爬取网易云音乐评论
2018/11/16 Python
使用Python的turtle模块画国旗
2019/09/24 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
荆州古城导游词
2015/02/06 职场文书
三方合作意向书范本
2015/05/09 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python