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编程中八种常见的文件操作方式
Nov 19 PHP
php下intval()和(int)转换使用与区别
Jul 18 PHP
PHP 多进程 解决难题
Jun 22 PHP
php共享内存段示例分享
Jan 20 PHP
基于PHP实现等比压缩图片大小
Mar 04 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
laravel 实现用户登录注销并限制功能
Oct 24 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 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
一个查看session内容的函数
2006/10/09 PHP
PHP简介
2006/10/09 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
简述Python中的进程、线程、协程
2016/03/18 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python3生成手写体数字方法
2018/01/30 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS