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 相关文章推荐
将OICQ数据转成MYSQL数据
Oct 09 PHP
php基础知识:类与对象(1)
Dec 13 PHP
PHP Document 代码注释规范
Apr 13 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
php压缩多个CSS为一个css的代码并缓存
Apr 21 PHP
PHP-redis中文文档介绍
Feb 07 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
php实现Session存储到Redis
Nov 11 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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数组查找函数总结
2014/11/18 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
重写javascript中window.confirm的行为
2012/10/21 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
记者岗位职责
2014/01/06 职场文书
奥利奥广告词
2014/03/20 职场文书
搞笑的获奖感言
2014/08/16 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
中小学生学籍证明
2014/10/25 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
保护动物的宣传语
2015/07/13 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS