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 相关文章推荐
用PHP制作的意见反馈表源码
Mar 11 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
Apr 03 PHP
PHP循环获取GET和POST值的代码
Apr 09 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
php实现字符串翻转的方法
Mar 27 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 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开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
详解JavaScript函数
2015/12/01 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
JS实现图片切换特效
2019/12/23 Javascript
opencv python 图像去噪的实现方法
2018/08/31 Python
python实现桌面壁纸切换功能
2019/01/21 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
Python requests模块cookie实例解析
2020/04/14 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
期末总结的个人自我评价
2013/11/02 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
入股协议书范本
2014/11/01 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
Django程序的优化技巧
2021/04/29 Python
解析python中的jsonpath 提取器
2022/01/18 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android