析构函数与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 相关文章推荐
解析dedeCMS验证码的实现代码
Jun 07 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
May 04 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php中$_POST与php://input的区别实例分析
Jan 07 PHP
Laravel 5 学习笔记
Mar 06 PHP
php验证手机号码
Nov 11 PHP
PHP二维数组排序简单实现方法
Feb 14 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 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_odbc和php写的serach数据库程序
2006/10/09 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
js arguments对象应用介绍
2012/11/28 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
js实现滚动条自动滚动
2020/12/13 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
Python pickle模块用法实例
2015/04/14 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
国际花店:Pickup Flowers
2020/04/10 全球购物
优秀党务工作者事迹材料
2014/05/07 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android
python实现双链表
2022/05/25 Python
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技