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

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

GC(Garbage Collector)
在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁。

这是PHP的GC(Garbage Collector)垃圾处理机制,防止内存溢出。

当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中的所有对象同样被销毁。

__destruct() 析构函数
__destruct() 析构函数,是在垃圾对象被回收时执行。

析构函数也可以被显式调用,但不要这样去做。

析构函数是由系统自动调用的,不要在程序中调用一个对象的虚构函数。

析构函数不能带有参数。

如下面程序所示,程序结束前,所有对象被销毁。析构函数被调用了。

PHP代码
  1. <?php   
  2. class Person {   
  3.     public function __destruct(){     
  4.         echo '析构函数现在执行了 <br />';     
  5.         echo '这里一般用来设置、关闭数据库、关闭文件等收尾工作';   
  6.     }   
  7. }   
  8.   
  9. $p = new Person();   
  10. for($i = 0; $i < 5; $i++){     
  11.     echo "$i <br />";     
  12. }   
  13. ?>  


程序运行结果:

运行结果
  1. 0   
  2. 1   
  3. 2   
  4. 3   
  5. 4   
  6. 析构函数现在执行了   
  7. 这里一般用来设置、关闭数据库、关闭文件等收尾工作  

当对象没有指向时,对象被销毁。

PHP代码
  1. <?php   
  2. class Person {     
  3.     public function __destruct(){     
  4.         echo '析构函数现在执行了 <br />';     
  5.     }     
  6. }   
  7.   
  8. $p = new Person();     
  9. $p = null; // 析构函数在这里执行了     
  10. $p = "abc"// 一样的效果     
  11.   
  12. for($i = 0; $i < 5; $i++){     
  13.     echo "$i <br />";     
  14. }   
  15. ?>  

程序运行结果:

运行结果
  1. 析构函数现在执行了      
  2. 0      
  3. 1      
  4. 2      
  5. 3      
  6. 4    

上面的例子第10行,我们将$p设置为空或者第11行赋予$p一个字符串,这样$p之前指向的对象就成为了垃圾对象。PHP将这个对象垃圾销毁。

 

php unset变量

PHP代码
  1. <?php   
  2. class Person {   
  3.     public function __destruct(){   
  4.         echo '析构函数现在执行了 <br />';   
  5.     }   
  6. }   
  7.   
  8. $p = new Person();   
  9. $p1 = $p;   
  10. unset($p);   
  11.   
  12. echo '现在把 $p 被销毁了,对象是否也被销毁了呢?<br />';     
  13.   
  14. for($i = 0; $i < 5; $i++){   
  15.     echo "$i <br />";   
  16. }   
  17.   
  18. echo '现在再把 $p1 也销毁掉,即已经没有指向对象的变量了<br />';     
  19. unset($p1); // 现在没有指向对象的变量了,析构函数在这里执行了     
  20. ?>  

程序运行结果:

运行结果
  1. 现在把 $p 被销毁了,对象是否也被销毁了呢?     
  2. 0      
  3. 1      
  4. 2      
  5. 3      
  6. 4      
  7. 现在再把 $p1 也销毁掉,即已经没有指向对象的变量了     
  8. 析构函数现在执行了   

unset 销毁的是指向对象的变量,而不是这个对象。

 

Tags: php, 垃圾回收, 析构

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5

发表评论

评论内容 (必填):