|
Posted by Mladen Gogala on 01/13/06 17:15
On Fri, 13 Jan 2006 15:12:29 +0000, Mladen Gogala wrote:
> On Thu, 12 Jan 2006 19:01:10 -0800, Chung Leong wrote:
>
>> Here's a little brain teaser distilled from a bug that took me a rather
>> long time to figure out. The two functions in the example below behave
>> differently. The difference is easy to spot, of ocurse. The challenge
>> is correctly explaining why this is so. Why does the second function
>> seemingly corrupt the cloned copy of an object?
>
> It doesn't. You are not writing to the clone, you are writing to the
> original. You are setting the original data to "", not the clone. Clone
> is a bitwise copy, not a reference. If you want it to be something else
> then a bitwise copy, you have to define the __clone function. What you
> should have written in place of "clone" is $clone =& $obj; Then the
> assignment would work and the function would return a reference to
> the original object, which is also passed by reference.
This produces the results you probably expected:
<?php
function Bobcat(&$obj) {
$clone = clone $obj;
$obj->attributes['Length'] = 0;
$obj->data = "";
return $clone;
}
function BritneySpear(&$obj) {
$attr =& $obj->attributes;
$clone =& $obj;
$obj->attributes['Length'] = 0;
$obj->data = "";
return $clone;
}
$data = "This is a test";
$obj1->attributes = array('Length' => strlen($data));
$obj1->data = $data;
$clone1 = Bobcat($obj1);
print_r($clone1);
$obj2->attributes = array('Length' => strlen($data));
$obj2->data = $data;
$clone2 = BritneySpear($obj2);
print_r($clone2);
?>
$ php ttt
stdClass Object
(
[attributes] => Array
(
[Length] => 14
)
[data] => This is a test
)
stdClass Object
(
[attributes] => Array
(
[Length] => 0
)
[data] =>
)
$
--
http://www.mgogala.com
Navigation:
[Reply to this message]
|