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 Token(令牌)设计
Mar 15 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
php过滤危险html代码
Aug 18 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
php去除字符串换行符示例分享
Feb 13 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
php无限级分类实现方法分析
Oct 19 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 PHP
php中用unset销毁变量并释放内存
May 10 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 PHP
CI框架简单分页类用法示例
Jun 06 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的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
python实现的防DDoS脚本
2011/02/08 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
python字典key不能是可以是啥类型
2020/08/04 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
蔻驰英国官网:COACH英国
2020/07/19 全球购物
会计岗位职责
2013/11/08 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
大学生秋游活动方案
2014/02/17 职场文书
婚前财产公证书
2014/04/10 职场文书
2015年科室工作总结
2015/04/10 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
Python中基础数据类型 set集合知识点总结
2021/08/02 Python