析构函数与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日历程序
Dec 06 PHP
php array的学习笔记
May 10 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
PHP采用get获取url汉字出现乱码的解决方法
Nov 13 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
php生成唯一的订单函数分享
Feb 02 PHP
PHP中的session安全吗?
Jan 22 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 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之第六天
2006/10/09 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
PHP框架性能测试报告
2016/05/08 PHP
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
轮播图组件js代码
2016/08/08 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
Python去掉字符串中空格的方法
2014/03/11 Python
实例讲解Python中的私有属性
2014/08/21 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python中Class类用法实例分析
2015/11/12 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
使用html5制作loading图的示例
2014/04/14 HTML / CSS
优秀管理者获奖感言
2014/02/17 职场文书
三爱活动实施方案
2014/03/19 职场文书
预备党员转正考核材料
2014/06/03 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
python实现MD5进行文件去重的示例代码
2021/07/09 Python
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server