析构函数与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和ACCESS写聊天室(九)
Oct 09 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
PHP的加密方式及原理
Jun 14 PHP
优化PHP代码技巧的小结
Jun 02 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
thinkPHP基于ajax实现的菜单与分页示例
Jul 12 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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模板技术原理【一】
2008/01/10 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
js 动态选中下拉框
2009/11/26 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
js中有关IE版本检测
2012/01/04 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
python 6行代码制作月历生成器
2020/09/18 Python
python中@contextmanager实例用法
2021/02/07 Python
python 实现IP子网计算
2021/02/18 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
德国机车企业:FC-Moto
2017/10/27 全球购物
英文简历自荐信范文
2013/12/11 职场文书
创意婚礼策划方案
2014/05/18 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python