Edit report at https://bugs.php.net/bug.php?id=61505&edit=1

 ID:                 61505
 Comment by:         phpmpan at mpan dot pl
 Reported by:        enelar at develop-project dot ru
 Summary:            Wrong destructors order
 Status:             Open
 Type:               Bug
 Package:            Class/Object related
 Operating System:   Ubuntu
 PHP Version:        5.3.10
 Block user comment: N
 Private report:     N

 New Comment:

This is not related to bug36759. 36759 is about destroying referenced object 
before referencing one even when circular dependency is not present.

Your case is completly different, as `$world` and `$human` do not reference 
each other. They're independent objects. `$human` is NOT part of `$world` just 
because you named the variables like that. Hence there is no reason to think 
that there should be any particular order of destruction.


Previous Comments:
------------------------------------------------------------------------
[2012-03-26 01:07:43] enelar at develop-project dot ru

Description:
------------
followed: https://bugs.php.net/bug.php?id=36759
They told that fixed in 5.2*, but its wrong! Reprodused in 5.3.2

Destructors on allocated objects should be called in reverse order:
$a = new world();
$b = new human();
== Shold be called as:
world->__construct();
human->__construct();
human->__destruct();
world->__destruct();
== Now its calling as:
world->__construct();
human->__construct();
world->__destruct(); // now people, cars and other exists without world. wtf??
human->__destruct();
== Why i think current way its wrong:
When we creating object $b, we expecting that object $a exists. And while 
lifetime $b, object $a should be exist. Even $b dying, $a should be exists.
We expect in $a that $b may be not exist, but we should`t check in all methods 
of $b 'is $a exist'.
Destructor its not exception and should be executed right.
== Some simular reports:
https://bugs.php.net/bug.php?id=38572
https://bugs.php.net/bug.php?id=29032 (if we imagine that $SESSION = new 
bla_bla(), before our code)

Test script:
---------------
class screen
{
  public $screen;
  public function __construct()
  {
    echo "screen construct<br>";
    $text->screen = "";
  }
  public function Write( $text )
  {
    echo "writed to screen $text<br>";
    $this->screen .= $text;
  }
  public function __destruct()
  {
    echo "screen destruct<br>";
    echo $this->screen;
  }
}
$A = new screen();
class dummy
{
  public function __constuct()
  {
    echo "dummy constuct<br>";
  }
  public function __destuct()
  {
    echo "dummy destruct<br>";
    global $A;
    $A->Write("Dummy: I`m dying!<br>");
    // or $A->DoVeryImportantActionBeforeDie($bla, $bla1);
  }
}
$B = new dummy();

Expected result:
----------------
screen construct
dummy constuct
writed to screen Dummy: I`m dying!
screen destruct
Dummy: I`m dying!

Actual result:
--------------
screen construct
dummy constuct
screen destruct
Fatal error: Call to a member function Write() on a non-object in ...


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61505&edit=1

Reply via email to