构造函数里注册了一个shutdown函数,echo ‘【来自shutdown函数】’
析构函数里echo '【来自析构函数】'一个和尚,一个道士,没什么太大的区别嘛总是要shudown函数在前,析构函数在后,连着执行的。我看到的问题比较浅,所以我武断的选择原生的析构函数,而弃用额外增生的shutdown函数。莫非这两个函数背后,没有什么别的影响性能什么的细节?

解决方案 »

  1.   

    转帖:
    php中为什么有了 __destruct函数后还没有把register_shutdown_function 置为deprecated ?代码说明一切:   1. <?php   
       2. class T1   
       3. {   
       4.      function __construct()   
       5.      {   
       6.          register_shutdown_function(array(&$this, 'shutdown_func'));   
       7.      }   
       8.        
       9.      function shutdown_func() {   
      10.          $fp = fopen("/tmp/t1.txt", "w+");   
      11.          fputs($fp, "向我开炮\n");   
      12.          fclose($fp);   
      13.      }   
      14. };   
      15.   
      16. $obj = new T1();   
      17. while (true) {   
      18.     // do nothing   
      19. }   
      20. 执行:   
      21. Fatal error: Maximum execution time of 30 seconds exceeded in /home/hanyh/workspace/website/t1.php on line 19  
      22. 结果:   
      23. hanyh@hanyh:~/workspace/git/django-pagination$ more /tmp/t1.txt   
      24. 向我开炮   
      25.   
      26. <?php   
      27. class T2   
      28. {   
      29.      function __destruct()   
      30.      {   
      31.          $fp = fopen("/tmp/t2.txt", "w+");   
      32.          fputs($fp, "向我开炮\n");   
      33.          fclose($fp);   
      34.      }   
      35. };   
      36.   
      37. $obj = new T2();   
      38. while (true) {   
      39.     // do nothing   
      40. }   
      41. 执行:   
      42. Fatal error: Maximum execution time of 30 seconds exceeded in /home/hanyh/workspace/website/t2.php on line 13  
      43. 结果:   
      44. hanyh@hanyh:~/workspace/git/django-pagination$ more /tmp/t2.txt   
      45. /tmp/t2.txt: 没有该文件或目录   
      46.   
      47. 由对比可知,使用register_shutdown_function才能保证即使脚本异常中止时,清理函数的代码仍然能够执行。所以在代码中必须在脚本退出时清理资源时,需要使用register_shutdown_function。
      

  2.   

    这两个函数
    register_shutdown_function
    只要是终止(包括错误等)它都会执行
    而另一个不是,所以不至于是既生瑜何生亮
      

  3.   

    而__destruct()是析构函数,只有在正常执行后才会执行
      

  4.   

    register_shutdown_function程序终止时会调用__destruct()是对象调用终止(销毁)时会调用,如果你们没有显时的终止的话,那么就会在程序终止的时候调用销毁对象时,调用析构函数这完全是2个概念$a = new a();// 这时析构函数就有用了
    unset($a); or $a = null;
      

  5.   

    中间用exit、die等人为退出合法语句时两个都起作用了。
    但是,如果调用一个不存在函数: jdslfj(),那么析构函数的就不灵光了,呵呵。