析构函数与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 相关文章推荐
如何使用脚本模仿登陆过程
Nov 22 PHP
php中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
关于js与php互相传值的介绍
Jun 25 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 PHP
PHP模板引擎Smarty内建函数详解
Apr 11 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PDO::lastInsertId讲解
Jan 29 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 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模板中出现空行解决方法
2011/03/08 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
python3.5 tkinter实现页面跳转
2018/01/30 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
python drf各类组件的用法和作用
2021/01/12 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
Ajax的优点和缺点
2014/11/21 面试题
什么是封装
2013/03/26 面试题
超市重阳节活动方案
2014/02/10 职场文书
理财计划书
2014/08/14 职场文书
小学体育课教学反思
2016/02/16 职场文书
初三数学教学反思
2016/02/17 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers