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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
深入php var_dump()函数的详解
Jun 05 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
php实现的Timer页面运行时间监测类
Sep 24 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
深入理解PHP原理之执行周期分析
Jun 01 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
tp5修改(实现即点即改)
Oct 18 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
apache和PHP如何整合在一起
2015/10/12 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
关于JS模块化的知识点分享
2019/10/16 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
python 通过 socket 发送文件的实例代码
2018/08/14 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
学校门卫岗位职责
2014/03/16 职场文书
设计顾问服务计划书
2014/05/04 职场文书
安全生产月演讲稿
2014/05/09 职场文书
小学教师培训方案
2014/06/09 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书