析构函数与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 相关文章推荐
NO3第三帝国留言簿制作过程
Oct 09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
一个用php实现的获取URL信息的类
Jan 02 PHP
php的正则处理函数总结分析
Jun 20 PHP
php 代码优化之经典示例
Mar 24 PHP
php去除重复字的实现代码
Sep 16 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 PHP
laravel 框架结合关联查询 when()用法分析
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读取文件并可支持远程文件的代码分享
2012/10/03 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
javascript知识点收藏
2007/02/22 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Django 连接sql server数据库的方法
2018/06/30 Python
查看python下OpenCV版本的方法
2018/08/03 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
python 魔法函数实例及解析
2019/09/25 Python
用python写测试数据文件过程解析
2019/09/25 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
教师节活动主持词
2014/04/02 职场文书
农村党员一句话承诺
2014/05/30 职场文书
导游欢送词
2015/01/31 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
服装店员工管理制度
2015/08/07 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
Elasticsearch 索引操作和增删改查
2022/04/19 Python
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS