clone wars

php.internals

Unnamed Person

22 years ago
It appears that cloning is broken, since a modification to the clone modifies the original. For my __clone method implementation, I allow all of the variables to be set by default except for one. But this problem persists even when I don't modify that one variable.

Unnamed Person

22 years ago
I forgot to mention: I am use b4 On 15 Feb 2004, at 5:45 PM, Herr Witten wrote:

Marcus Börger

22 years ago
Hello, most probably that property is a reference in which case the result is correct. Sunday, February 15, 2004, 11:45:56 PM, you wrote:
> It appears that cloning is broken, since a modification to the clone > modifies the original. For my __clone method implementation, I allow > all of the variables to be set by default except for one. But this > problem persists even when I don't modify that one variable.
-- Best regards, Marcus mailto:helly@php.net

Unnamed Person

22 years ago
It appears that only one of the variables, an array, is being shared across these multiple objects, but other array variables are not. Moreover, When I make a clone and then set the clone to null, all clones made thereafter are correct. $clone = clone $object; $clone = null; Also, I can't replicate the problem with another class. It only seems to be this class. On 15 Feb 2004, at 5:47 PM, Marcus Boerger wrote:

Unnamed Person

22 years ago
More specifically, This causes a change in $object: $clone = clone $object; $clone->troublesomeVariable = array(); But this doesn't: $clone = clone $cell; $clone = null; $clone->_subElements = array(); On 15 Feb 2004, at 7:35 PM, Herr Witten wrote:

Unnamed Person

22 years ago
That should be clone $object for the example. On 15 Feb 2004, at 7:39 PM, Herr Witten wrote:

Marcus Börger

22 years ago
Hello, first as i said do the following to verify: marcus@frodo /usr/src/php5 $ php -r '$a=array(1,2);class t{public $a;function f(){$this->a=&$GLOBALS["a"];}}$o1=new t;$o1->f();var_dump($o1);$o2=clone $o1;$o1->a=2;var_dump($o2);var_dump($o1);' make: `sapi/cli/php' is up to date. object(t)#1 (1) { ["a"]=> &array(2) { [0]=> int(1) [1]=> int(2) } } object(t)#2 (1) { ["a"]=> &int(2) } object(t)#1 (1) { ["a"]=> &int(2) } then remove the '&'. second read the docs and question such things on general@php.net. Monday, February 16, 2004, 1:39:44 AM, you wrote:
> More specifically,
> This causes a change in $object:
> $clone = clone $object; > $clone->troublesomeVariable = array();
> But this doesn't:
> $clone = clone $cell; > $clone = null; > $clone->_subElements = array();
> On 15 Feb 2004, at 7:35 PM, Herr Witten wrote:
>> It appears that only one of the variables, an array, is being shared >> across these multiple objects, but other array variables are not. >> Moreover, When I make a clone and then set the clone to null, all >> clones made thereafter are correct. >> >> $clone = clone $object; >> $clone = null; >> >> Also, I can't replicate the problem with another class. It only seems >> to be this class. >> >> On 15 Feb 2004, at 5:47 PM, Marcus Boerger wrote: >> >>> Hello, >>> >>> most probably that property is a reference in which case the result is >>> correct. >>> >>> Sunday, February 15, 2004, 11:45:56 PM, you wrote: >>> >>>> It appears that cloning is broken, since a modification to the clone >>>> modifies the original. For my __clone method implementation, I allow >>>> all of the variables to be set by default except for one. But this >>>> problem persists even when I don't modify that one variable. >>> >>> >>> >>> >>> -- >>> Best regards, >>> Marcus mailto:helly@php.net >>> >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >>
-- Best regards, Marcus mailto:helly@php.net

Unnamed Person

22 years ago
> first as i said do the following to verify:
It's a nice example, but it doesn't apply. I don't make a reference.
> second read the docs and question such things on general@php.net.
I did. This problem seemed to be internal, and it still does.

Marcus Börger

22 years ago
Hello, Monday, February 16, 2004, 1:54:36 AM, you wrote:
>> first as i said do the following to verify:
> It's a nice example, but it doesn't apply. I don't make a reference.
>> second read the docs and question such things on general@php.net.
> I did. This problem seemed to be internal, and it still does.
Ok, so you are sure var_dump() doesn't show the & for the property in question? If so i would need to know where exactly the array comes from. And the best way to proceed tehn is to create a bug report with a short reproducing script.
-- Best regards, Marcus mailto:helly@php.net

Unnamed Person

22 years ago
Here, I have reproduced the problem: class A { var $a = array(); public function makeAReference() { $array = $this->getA(); } public function &getA() { return $this->a; } } $A = new A; $A->a = array(1); $A->makeAReference(); $clone = clone $A; $clone->a = array(); print_r($A); Try it with an without $A->makeAReference() I sent in a report. Thanks. On 15 Feb 2004, at 8:04 PM, Marcus Boerger wrote:

Unnamed Person

22 years ago
This too: class A { var $a = array(); public function &getA() { return $this->a; } } $A = new A; $A->a = array(1); $array = &$A->getA(); $clone = clone $A; $clone->a = array(); print_r($A); On 15 Feb 2004, at 9:14 PM, Herr Witten wrote:

Unnamed Person

22 years ago
This was never resolved: Is this, or is this not a bug: class A { var $a; } $A = new A; $A->a = array(1); $array = &$A->a; $clone = clone $A; $clone->a = array(); //Affects a in $A. print_r($A);