PHP析构函数destruct与垃圾回收机制的讲解


Posted in PHP onMarch 22, 2019

析构函数

当某个对象成为垃圾或者当对象被显式销毁时执行。

PHP5中提供的析构函数是__destruct,其与构造方法__construct相对应。

垃圾回收——GC(Garbage Collector)

在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾,PHP会将其在内存中销毁。

这是PHP的GC(Garbage Collector)垃圾处理机制,垃圾加收可以防止内存溢出。

当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中的所有对象同样被销毁。

__destruct() 析构函数,是在垃圾对象被回收时执行。

析构函数是由系统自动调用的,也可以被显式调用,但不要这样去做。

如下面程序所示,程序结束前,所有对象被销毁。析构函数被调用了。

<?php
class Person {
 public function __destruct(){
 echo '析构函数现在执行了 <br />';
 echo '这里一般用来设置、关闭数据库、关闭文件等收尾工作';
 }
}
$p = new Person();
for($i = 0; $i < 5; $i++){
 echo "$i <br />";
}
?>

程序运行结果:
0
1
2
3
4
析构函数现在执行了
这里一般用来设置、关闭数据库、关闭文件等收尾工作

当对象没有指向时,对象被销毁。

<?php
class Person {
 public function __destruct(){
 echo '析构函数现在执行了 <br />';
 }
}
$p = new Person();
$p = null; // 析构函数在这里执行了
$p = "abc"; // 一样的效果
for($i = 0; $i < 5; $i++){
 echo "$i <br />";
}
?>

程序运行结果:

析构函数现在执行了
0
1
2
3
4

上面的例子中,我们将$p设置为空或者赋予$p一个字符串,这样$p之前指向的对象就成为了垃圾对象。PHP将这个对象垃圾销毁。

php unset变量

<?php
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 被销毁了,对象是否也被销毁了呢?
0
1
2
3
4
现在再把 $p1 也销毁掉,即已经没有指向对象的变量了
析构函数现在执行了

unset 销毁的是指向对象的变量,而不是这个对象。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
附件名前加网站名
Mar 23 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
php 定界符格式引起的错误
May 24 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
php并发加锁示例
Oct 17 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 PHP
PHP中的empty、isset、isnull的区别与使用实例
Mar 22 #PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 #PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 #PHP
简单实用的PHP文本缓存类实例
Mar 22 #PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 #PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 #PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 #PHP
You might like
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
js获取滚动距离的方法
2015/05/30 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python编写的最短路径算法
2015/03/25 Python
python采集百度百科的方法
2015/06/05 Python
Python2.x与Python3.x的区别
2016/01/14 Python
简单谈谈Python流程控制语句
2016/12/04 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python实现的端口扫描功能示例
2018/04/08 Python
django 将model转换为字典的方法示例
2018/10/16 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python图片合成的示例
2020/11/09 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
旅游个人求职信范文
2014/01/30 职场文书
反腐倡廉标语
2014/06/24 职场文书
小学生通知书评语
2014/12/31 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
Python之matplotlib绘制折线图
2022/04/13 Python