It is well documented that PHP5 OOP objects are passed by reference by default. If this is by default, it seems to me there is a no-default way to copy with no reference, how??
function refObj($object){ foreach($object as &$o){ $o = 'this will change to ' . $o; } return $object; } $obj = new StdClass; $obj->x = 'x'; $obj->y = 'y'; $x = $obj; print_r($x) // object(stdClass)#1 (3) { // ["x"]=> string(1) "x" // ["y"]=> string(1) "y" // } // $obj = refObj($obj); // no need to do this because refObj($obj); // $obj is passed by reference print_r($x) // object(stdClass)#1 (3) { // ["x"]=> string(1) "this will change to x" // ["y"]=> string(1) "this will change to y" // }
At this point I would like $x
to be the original $obj
, but of course it's not. Is there any simple way to do this or do I have to code something like this
Similar to adding elements to arrays without mutating them, You can use the spread operator to copy the existing object into a new one, with an additional value. If a value already exists at the specified key, it will be overwritten.
There are several ways to copy an object, most commonly by a copy constructor or cloning. Copying is done mostly so the copy can be modified or moved, or the current value preserved. If either of these is unneeded, a reference to the original data is sufficient and more efficient, as no copying occurs.
<?php $x = clone($obj);
So it should read like this:
<?php function refObj($object){ foreach($object as &$o){ $o = 'this will change to ' . $o; } return $object; } $obj = new StdClass; $obj->x = 'x'; $obj->y = 'y'; $x = clone($obj); print_r($x) refObj($obj); // $obj is passed by reference print_r($x)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With