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基础知识介绍
Sep 17 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
php实现每天自动变换随机问候语的方法
May 12 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
两种php调用Java对象的方法
2006/10/09 PHP
php预定义常量
2006/12/25 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
php强制运行广告的方法
2014/12/01 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python制作钉钉加密/解密工具
2016/12/07 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
python列表的增删改查实例代码
2018/01/30 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python进阶之自定义可迭代的类
2019/08/20 Python
django实现类似触发器的功能
2019/11/15 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
一道输出判断型Java面试题
2014/10/01 面试题
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
会计学自荐信
2014/06/03 职场文书
公益广告标语
2014/06/19 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
老公保证书
2015/01/17 职场文书
实习介绍信范文
2015/05/05 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android
Promise静态四兄弟实现示例详解
2022/07/07 Javascript