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
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
PHP读取xml方法介绍
Jan 12 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
非常重要的php正则表达式详解
Jan 04 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
PHP中$GLOBALS与global的区别详解
Mar 21 PHP
禁止直接访问php文件代码分享
May 05 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 数学运算验证码实现代码
2009/10/11 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
javascript call和apply方法
2008/11/24 Javascript
js 异步处理进度条
2010/04/01 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
jQuery事件详解
2017/02/23 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
Python Queue模块详解
2014/11/30 Python
Python fileinput模块使用实例
2015/05/28 Python
在python中安装basemap的教程
2018/09/20 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
大学毕业自我评价
2014/02/02 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
班级课外活动总结
2014/07/09 职场文书
通知范文怎么写
2015/04/16 职场文书
党支部评议意见
2015/06/02 职场文书