#30823 [Opn->Asn]: Objects destroyed in FIFO rather LIFO.

From: Date: Thu, 21 Apr 2005 15:33:51 +0000
Subject: #30823 [Opn->Asn]: Objects destroyed in FIFO rather LIFO.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-78005@lists.php.net to get a copy of this message
ID: 30823 Updated by: sniper@php.net Reported By: richard dot quadling at bandvulc dot co dot uk -Status: Open +Status: Assigned Bug Type: Class/Object related Operating System: * PHP Version: 5CVS-2005-03-06 -Assigned To: +Assigned To: andi New Comment: Andi, is this behaviour carved into ZE2 stone or can it be changed? Previous Comments: ------------------------------------------------------------------------ [2004-11-19 08:46:27] richard dot quadling at bandvulc dot co dot uk Nope. The output is ... destroy A destroy B Objects are destroyed in the order they are created. This is, in my opinion, bad. I would expect ... destroy B destroy A (and it took me at least 2 minutes to work out why I got nothing at all - short tags!). Richard. ------------------------------------------------------------------------ [2004-11-18 22:29:44] tony2001@php.net Please, run this code: <? class a { function __destruct() { echo "destroy A\n"; } } class b { function __destruct() { echo "destroy B\n"; } } $a = new a; $b = new b; ?> and make sure that it works as you expect. ------------------------------------------------------------------------ [2004-11-18 11:01:10] richard dot quadling at bandvulc dot co dot uk Description: ------------ Hi. Create Object A (a action logging class) Create Object B (a class which allows generates logging actions). As each method in B is called a log entry is made by using an IN and OUT method on A. During the shutdown, the __destroy method of A is called (which closes the log), then, the __destroy method of B is called. This method has the logging code in it. This then tries to call a destroyed object. As you cannot refer to an object until it is created, you should always destroy objects in the reverse order in which they were created. Richard. Reproduce code: --------------- <?php class A { public function __construct() { echo 'Constructing A<br />'; } public function __destruct() { echo 'Destroying A<br />'; } public function Logging($sLog) { echo date('r') . ' '. $sLog . '<br />'; } } class B { public function __construct() { $GLOBALS['objLogger']->Logging(__METHOD__ . ' ' . __FILE__ . ' ' . __LINE__); } public function __destruct() { $GLOBALS['objLogger']->Logging(__METHOD__ . ' ' . __FILE__ . ' ' . __LINE__); } public function Action() { $GLOBALS['objLogger']->Logging(__METHOD__ . ' ' . __FILE__ . ' ' . __LINE__); } } $objLogger = new A(); $objAction = new B(); $objAction->Action(); ?> Expected result: ---------------- Constructing A Thu, 18 Nov 2004 09:51:07 +0000 B::__construct D:\Data\Web Sites\Quick Scripts\public_html\PHP Bug testing\Objects destroyed FIFO.php 24 Thu, 18 Nov 2004 09:51:07 +0000 B::Action D:\Data\Web Sites\Quick Scripts\public_html\PHP Bug testing\Objects destroyed FIFO.php 34 Thu, 18 Nov 2004 09:51:07 +0000 B::__destruct D:\Data\Web Sites\Quick Scripts\public_html\PHP Bug testing\Objects destroyed FIFO.php 29 Destroying A Actual result: -------------- Constructing A Thu, 18 Nov 2004 09:51:07 +0000 B::__construct D:\Data\Web Sites\Quick Scripts\public_html\PHP Bug testing\Objects destroyed FIFO.php 24 Thu, 18 Nov 2004 09:51:07 +0000 B::Action D:\Data\Web Sites\Quick Scripts\public_html\PHP Bug testing\Objects destroyed FIFO.php 34 Destroying A Thu, 18 Nov 2004 09:51:07 +0000 B::__destruct D:\Data\Web Sites\Quick Scripts\public_html\PHP Bug testing\Objects destroyed FIFO.php 29 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=30823&edit=1

« previous php.bugs (#78005) next »