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获得文件扩展名三法
Nov 25 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
php利用腾讯ip分享计划获取地理位置示例分享
Jan 20 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
php中strtotime函数用法详解
Nov 15 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 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
eAccelerator的安装与使用详解
2013/06/13 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
js活用事件触发对象动作
2008/08/10 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
Python验证码识别处理实例
2015/12/28 Python
简单谈谈python中的多进程
2016/11/06 Python
django中forms组件的使用与注意
2019/07/08 Python
python支持多线程的爬虫实例
2019/12/21 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
实习生个人的自我评价
2013/12/08 职场文书
融资租赁计划书
2014/04/29 职场文书
父亲节活动策划方案
2014/08/24 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
服务员态度差检讨书
2014/10/28 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS