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 如何向 MySQL 发送数据
Oct 09 PHP
php 变量定义方法
Jun 14 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
Jan 07 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 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动态实现表格跨行跨列实现代码
2012/11/06 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python实现指定字符串补全空格的方法
2015/04/30 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
深入理解Django-Signals信号量
2019/02/19 Python
使用python实现简单五子棋游戏
2019/06/18 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python实现密码薄文件读写操作
2019/12/16 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
十月份红领巾广播稿
2014/01/22 职场文书
医院义诊活动总结
2014/07/04 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android