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中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
php数据库配置文件一般做法分享
Jul 07 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 PHP
php常用日期时间函数实例小结
Jul 04 PHP
php 实现银联商务H5支付的示例代码
Oct 12 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解析RSS的方法
2015/03/05 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
详解Python循环作用域与闭包
2019/03/21 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
python实现感知机模型的示例
2020/09/30 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
授权委托书格式模板
2014/04/03 职场文书
租房合同协议书
2014/04/09 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
化验室岗位职责
2015/02/14 职场文书
2016年元旦寄语
2015/08/17 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
如何使用pdb进行Python调试
2021/06/30 Python