ID: 26673
Updated by: [EMAIL PROTECTED]
Reported By: samlw at aol dot com
-Status: Open
+Status: Feedback
Bug Type: Scripting Engine problem
Operating System: *
PHP Version: 4.3.4
New Comment:
Please provide a bit better script than this.
And what makes you think this isn't expected behaviour?
Previous Comments:
------------------------------------------------------------------------
[2003-12-19 18:17:10] samlw at aol dot com
Description:
------------
In certain cases, the reference
counting mechanism seems to become confused when
dealing with nested objects.
If class 'outer' has a member that is an object of
class 'inner', then a copy of an instance of outer
sometimes shares the original's reference to inner. As
a result, if a change is made to the inner member of
the copy, the original's inner is also changed. See the
attached code for a working example of this problem.
I have reproduced this problem in v 4.3.2 and 4.3.4
running on OS X.
Reproduce code:
---------------
class inner {
var $val1;
var $val2;
function inner ($val1, $val2) {
$this->set($val1, $val2);
}
function set ($val1, $val2) {
$this->val1 = $val1;
$this->val2 = $val2;
}
}
class outer {
var $val0;
var $inner;
function outer ($val0, $val1, $val2) {
$this->val0 = $val0;
$this->inner = new inner($val1, $val2);
}
function set ($val0, $val1, $val2) {
$this->val0 = $val0;
$this->inner->set($val1, $val2);
}
}
// construct and dump an object with values [0, 1, 2]
$myOuter = new outer(0, 1, 2);
var_dump($myOuter);
echo '<br />--------<br />';
// change values to [3, 4, 5]
$myOuter->set(3, 4, 5);
var_dump($myOuter);
echo '<br />--------<br />';
// make a COPY and change values to [6, 7, 8]
$myOuterCopy = $myOuter;
$myOuterCopy->set(6, 7, 8);
var_dump($myOuterCopy);
echo '<br />--------<br />';
// dump original - should still be [3, 4, 5], but it is [3, 7, 8]!!!
// the inner object is not getting copied on modification!!!
var_dump($myOuter);
echo '<br />--------<br />';
Expected result:
----------------
The final var_dump should produce:
object(outer)(2) { ["val0"]=> int(3) ["inner"]=>
&object(inner)(2) { ["val1"]=> int(4)
["val2"]=> int(5) } }
Actual result:
--------------
The final var_dump produces:
object(outer)(2) { ["val0"]=> int(3) ["inner"]=>
&object(inner)(2) { ["val1"]=> int(7)
["val2"]=> int(8) } }
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=26673&edit=1