Bug #14744 Updated: destructor emulation problem (references?)

From: Date: Sat, 02 Mar 2002 02:47:11 +0000
Subject: Bug #14744 Updated: destructor emulation problem (references?)
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-1445@lists.php.net to get a copy of this message
ID: 14744 Updated by: ssb@php.net Reported By: cox@idecnet.com -Status: Open +Status: Closed Bug Type: Scripting Engine problem Operating System: Linux PHP Version: 4.1.0 New Comment: If you want to use destructors, always instantiate the object with "&new" instead of "new". Previous Comments: ------------------------------------------------------------------------ [2001-12-28 14:54:21] cox@idecnet.com The paste seems that wasn't very good, sorry. The correct code: <?php $GLOBALS['_call_destruct'] = null; class foo { var $a = "orig value"; function foo() { $this->register(); } function register() { $GLOBALS['_call_destruct'] =& $this; } } function _destruct() { $foo =& $GLOBALS['_call_destruct']; echo "in destructor: {$foo->a}\n"; } register_shutdown_function('_destruct'); $foo = new Foo; $foo->a = "new value"; echo "updated value: {$foo->a}\n"; ?> ------------------------------------------------------------------------ [2001-12-28 13:54:45] cox@idecnet.com I catched a bug in the PEAR object destructor emulation and could isolate the problem in this script. <?php $GLOBALS['_call_destruct'] = null; class foo { var $a = "orig value"; function foo() { $this->register(); } function register() { $GLOBALS['_call_destruct'] =& $this; } }updated value: new value in destructor: orig value function _destruct() { $foo =& $GLOBALS['_call_destruct']; echo "in destructor: {$foo->a}\n"; } register_shutdown_function('_destruct'); $foo = new Foo; $foo->a = "new value"; echo "updated value: {$foo->a}\n"; ?> This outputs: updated value: new value in destructor: orig value Which means that the value of the "a" property is lost. Really the whole object is equal to the object comming from the constructor instead of the modified one. This doesn't ocurr if you register the object in a method out the constructor. The correct output of this should be: updated value: new value in destructor: new value -- Tomas V.V.Cox ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=14744&edit=1

« previous php.bugs (#1445) next »