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 相关文章推荐
一个简洁的多级别论坛
Oct 09 PHP
如何写php程序?
Dec 08 PHP
MySQL中create table语句的基本语法是
Jan 15 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
PHP列出MySQL中所有数据库的方法
Mar 12 PHP
php通过asort()给关联数组按照值排序的方法
Mar 18 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
php 数组随机取值的简单实例
May 23 PHP
php5与php7的区别点总结
Oct 11 PHP
PHP实现递归的三种方法
Jul 04 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实现的mongodb操作类
2015/05/28 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
JS 有名函数表达式全面解析
2010/03/19 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Django如何自定义分页
2018/09/25 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
将相和教学反思
2014/02/04 职场文书
运动会入场词60字
2014/02/15 职场文书
岗位职责风险防控
2014/02/18 职场文书
员工辞职信范文大全
2015/05/12 职场文书
学校运动会简讯
2015/07/20 职场文书
宿舍管理制度范本
2015/08/07 职场文书
师德培训心得体会2016
2016/01/09 职场文书