ID: 30823 User updated by: richard dot quadling at bandvulc dot co dot uk Reported By: richard dot quadling at bandvulc dot co dot uk Status: Bogus Bug Type: Class/Object related Operating System: * PHP Version: 5CVS-2005-03-06 Assigned To: andi New Comment:
Ah. What the answer should have been is to use unset() on the object reference. I saw a forest and forgot my chainsaw. Sorry for wasting time. But, I do think that unhandled objects should be destroyed LIFO. Richard. Previous Comments: ------------------------------------------------------------------------ [2005-04-22 00:34:01] [EMAIL PROTECTED] Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php There is no predefined order in which objects are destroyed. It is random as object id's are re-used after objects have been destroyed. There is no way (and I don't think there should be) to change this as we are efficiently using existing object space. You have to build your own mechanism (which should be quite easy) in order to order certain destruction processes. ------------------------------------------------------------------------ [2005-04-21 17:33:50] [EMAIL PROTECTED] Andi, is this behaviour carved into ZE2 stone or can it be changed? ------------------------------------------------------------------------ [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] [EMAIL PROTECTED] 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
