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 相关文章推荐
使用adodb lite解决问题
Dec 31 PHP
php中的时间显示
Jan 18 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
隐性调用php程序的方法
Jun 13 PHP
php注册登录系统简化版
Dec 28 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
php连接oracle数据库的核心步骤
May 26 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
php创建图像具体步骤
Mar 13 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
laravel 查询数据库获取结果实现判断是否为空
Oct 24 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和ACCESS写聊天室(二)
2006/10/09 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php实例分享之二维数组排序
2014/05/15 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
应届生财务管理求职信
2013/11/06 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
幼儿园运动会口号
2014/06/07 职场文书
身边的榜样活动方案
2014/08/20 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
电影复兴之路观后感
2015/06/02 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
Python使用永中文档转换服务
2022/05/06 Python