#31525 [Asn->Csd]: object reference being dropped. $this getting lost.

From: Date: Thu, 05 May 2005 17:45:41 +0000
Subject: #31525 [Asn->Csd]: object reference being dropped. $this getting lost.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-78663@lists.php.net to get a copy of this message
ID: 31525 Updated by: dmitry@php.net Reported By: yml at yml dot com -Status: Assigned +Status: Closed Bug Type: Zend Engine 2 problem Operating System: * PHP Version: 5CVS-2005-03-03 Assigned To: andi New Comment: Fixed in CVS HEAD and PHP_5_0. Previous Comments: ------------------------------------------------------------------------ [2005-04-29 03:46:43] sniper@php.net Andi, I think you once responded to similar issue regarding return() with/without parenthesis.. ------------------------------------------------------------------------ [2005-03-06 05:55:37] yml at yml dot com Problem found. Removing all the ()'s from reference returning functions and the problem has completely disappeared. However, the case should be caught by the parser and a warning generated. Using parens around returns returning references will cause symbol table corruption occassionally ... ------------------------------------------------------------------------ [2005-03-06 02:43:51] michaels at crye-leike dot com True, if getThis() is declared to return a reference then everything works as expected. However, looking through the original reproduce code I noticed something else. If you add parentheses around $this in getThis() then the unexpected behavior returns. Complete code: <?php class Foo { function &getThis() { return ($this); } function destroyThis() { $baz =& $this->getThis(); } } $bar = new Foo(); $bar->destroyThis(); var_dump($bar); ?> Produces: NULL Expected: object(Foo)#1 (0) { } ------------------------------------------------------------------------ [2005-03-06 01:50:27] yml at yml dot com Unfortunately the shortened script works as it should if you declare getThis to return a reference as in function &getThis() If however, you refer to the "too-long" script I put together at: http://www.formvista.com/uploaded_files/php5_drops_object.php.txt There is something different about it that causes $this to get dropped even when the method is declared return-by-reference. I haven't been able to narrow it down but it's entirely possible I'm overlooking something obvious. It's got to be something related to legacy pass by reference notation =&. The strange thing is it worked in 5.0.1 and broke in 5.0.2 or .3. ------------------------------------------------------------------------ [2005-03-06 01:26:05] michaels at crye-leike dot com FWIW, here's a shorter script that reproduces the problem for me on PHP 5.0.3: <?php class Foo { function getThis() { return $this; } function destroyThis() { $baz =& $this->getThis(); } } $bar = new Foo(); $bar->destroyThis(); var_dump($bar); ?> This outputs: NULL If I change the assign-by-reference operator (=&) to the normal assignment operator (=) inside destroyThis(), I get: object(Foo)#1 (0) { } Hope this helps... ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/31525 -- Edit this bug report at http://bugs.php.net/?id=31525&edit=1

« previous php.bugs (#78663) next »