ID: 31525
User updated by: yml at yml dot com
Reported By: yml at yml dot com
Status: Open
Bug Type: Zend Engine 2 problem
Operating System: *
PHP Version: 5CVS-2005-03-03
New Comment:
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 ...
Previous Comments:
------------------------------------------------------------------------
[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...
------------------------------------------------------------------------
[2005-03-03 18:32:24] yml at yml dot com
1. Same problem. No improvement. $this is getting dropped. Used to work
in 5.0RC2. Since 5.0.3 it's been broken.
2. The script I sent was puny. Given how terribly buggy the Zend engine
is, expecting that all serious parser errors can be reproduced in a
total of 20 lines or less is ridiculous. The meat of the script I sent
clearly reproduces the problem in 8 lines, not including the supporting
classes.
You guys wouldn't pull it from my site; and now you won't look at it if
I send it to you. Exactly what would you propose I do to help you track
this down?
The 85,000 lines of code that's actually having this problem (and
producing a coredump), now that's a huge "script".
------------------------------------------------------------------------
[2005-02-28 21:10:16] [EMAIL PROTECTED]
Please try using this CVS snapshot:
http://snaps.php.net/php5-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5-win32-latest.zip
..and NEVER ever attach such HUGE scripts in your report!!!!
------------------------------------------------------------------------
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