测试代码如下:< ? php
class testClass1
{
    function __destruct( ) {
        printf ( "%s::__destruct()<br/>\n" , get_class ( ) ) ;
    }
}class testClass2
{
    public $ cass1 ;
    function __construct( $ class1 ) {
        $ this - > class1 = $ class1 ;
    }
    function display( ) {
        echo "are you ready!<br/>\n" ;
    }
    function __destruct( ) {
        printf ( "%s::__destruct()<br/>\n" , get_class ( ) ) ;
    }
}function testfunc( $ class2 )
{
  $ class2 - > display( ) ;
  exit ( ) ;    //第二次测试,唯一要注释的行
}
$ class1 = new testClass1( ) ;
$ class2 = new testClass2( $ class1 ) ;testfunc( $ class2 ) ;
? >
第一次在 testfunc() 中退出:
are you ready!<br/>
testClass1::__destruct()<br/>
testClass2::__destruct()<br/>第二次不在 testfunc() 中退出(注释掉那个exit后):
are you ready!<br/>
testClass2::__destruct()<br/>
testClass1::__destruct()<br/>可以看出这两个不同位置的退出造就了来那个不同的结果,从来理论上讲, 第二次的结果才是我们想要的。
如果你在testClass2::__destruct()是用 testClass1中的一些销毁掉的东西那将是一场噩梦。这应该算一个很可恶的bug

解决方案 »

  1.   

    不知道LZ有没有认真看过手册
    exit的说明
      

  2.   

    楼主你应该加一个 testClass3这样看看你就会觉得这个其实也不算是bug
      

  3.   

    testClass2还没有还没有销毁,那么testClass1就不应该销毁,这个exit没有关系,关系是在函数中和外面才有区别,你在最后一行加个exit结果还是一个样
      

  4.   

    希望php开发者能早日解决这个问题,现在的php都有这个问题,用php类感觉很不爽,至少多自动销毁那是有点点不敢用
      

  5.   


    既然exit了,所有的对象都应该被销毁,顺序已经不重要了,因为exit意味着要收工了
    如果业务逻辑依赖这种顺序,你可以显式的控制它,在退出之前,手动销毁对象
      

  6.   


    我知道这样是可以的,但这个php 应该可以实现这种销毁顺序, 这是一个缺陷
      

  7.   

    如果系统应该做这个事情,这种情况应当以什么顺序销毁?
    class A
    {
        public $T; 
        function __destruct()
        {   
            echo "A\n";
        }   
    };class B
    {
        public $T; 
        function __destruct()
        {   
            echo "B\n";
        }   
    };$X = new B;
    $Y = new A;$X->T=$Y;
    $Y->T=$X;