PHP析构函数destruct与垃圾回收机制的讲解

 更新时间:2019年03月22日 15:37:01   作者:CODETC  
今天小编就为大家分享一篇关于PHP析构函数destruct与垃圾回收机制的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

析构函数

当某个对象成为垃圾或者当对象被显式销毁时执行。

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 Stream_*系列函数

    PHP Stream_*系列函数

    流(stream)是一种数据抽象。使用流包装数据源后,数据都将会获得统一的操作,不管数据源是文件、网络连接、压缩数据中的哪一种。PHP中的stream_*系列函数就是用来获取、管理流的一组函数。
    2010-08-08
  • Snoopy类使用小例子

    Snoopy类使用小例子

    下载:http://sourceforge.net/projects/snoopy/ 今天才发现这个好东西,赶紧去下载了来看看,是用的parse_url 还是比较习惯curl
    2008-04-04
  • 学习php笔记 字符串处理

    学习php笔记 字符串处理

    学习php笔记 字符串处理,需要的朋友可以参考下。
    2010-10-10
  • PHP5.6读写excel表格文件操作示例

    PHP5.6读写excel表格文件操作示例

    这篇文章主要介绍了PHP5.6读写excel表格文件操作,结合实例形式分析了php5.6环境下使用PHPExcel插件针对Excel表格读写的相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • php实现的顺序线性表示例

    php实现的顺序线性表示例

    这篇文章主要介绍了php实现的顺序线性表,结合实例形式分析了PHP顺序线性表的定义、元素获取、插入、删除等相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • PHP CURL获取返回值的方法

    PHP CURL获取返回值的方法

    这篇文章主要介绍了PHP CURL获取返回值的方法,需要的朋友可以参考下
    2014-05-05
  • phpmyadmin3 安装配置图解教程

    phpmyadmin3 安装配置图解教程

    基于PHP开发的phpmyadmin也是一个非常好用的Mysql数据库管理程序,在xampp等PHP环境配置安装程序中,phpmyadmin也是一个必备的PHP程序
    2012-03-03
  • php下实现折线图效果的代码

    php下实现折线图效果的代码

    php下实现折线图效果的代码...
    2007-04-04
  • PECL方式安装php-mongodb扩展方法

    PECL方式安装php-mongodb扩展方法

    下面小编就为大家分享一篇PECL方式安装php-mongodb扩展方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 深思 PHP 数组遍历的差异(array_diff 的实现)

    深思 PHP 数组遍历的差异(array_diff 的实现)

    还是部门无聊的考题,不过这次考的是 PHP 的能力。题目如下: 给你两个分别有 5000 个元素的数组,计算他们的差集 -- 说白了也就是用 PHP 和你认为最好的算法实现 array_diff 的算法。初次接到这个题目,我发现这非常的简单,于是按照以往的经验“随便”写了一个:
    2008-03-03

最新评论