Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a copy of an object without reference?

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

like image 942
acm Avatar asked Nov 08 '10 11:11

acm


People also ask

How can we copy object without mutating?

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.

Can an object be copied?

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.


1 Answers

<?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) 
like image 144
Treffynnon Avatar answered Sep 22 '22 22:09

Treffynnon