I have an array of objects. I know that objects get assigned by \"reference\" and arrays by \"value\". But when I assign the array, each element of the array is referencing
You need to loop it (possibly using a function like array_map()
for that), there is no PHP function to automatically perform a deep copy of an array.
Just include this function in all of your classes. This will do a deep clone of all objects in case if you have arrays of objects within the object itself. It will trigger all of the __clone()
functions in these classes:
/**
* Clone the object and its properties
*/
public function __clone()
{
foreach ($this as $key => $property)
{
if(is_array($property))
{
foreach ($property as $i => $o)
{
if(is_object($o)) $this->$key[$i] = clone $o;
else $this->$key[$i] = $o;
}
}
else if(is_object($property)) $this->$key = clone $property;
else $this->$key = $property;
}
}
I opted for clone as well. Cloning an array does not work (you could consider some arrayaccess implementation to do so for you), so as for the array clone with array_map:
class foo {
public $store;
public function __construct($store) {$this->store=$store;}
}
$f = new foo('moo');
$a = array($f);
$b = array_map(function($o) {return clone $o;}, $a);
$b[0]->store='bar';
var_dump($a, $b);
If your objects support serialisation, you can even sort of deep shallow copy/clone with a tour into their sleeping state and back:
$f = new foo('moo');
$a = array($f);
$b = unserialize(serialize($a));
$b[0]->store='bar';
var_dump($a, $b);
However, that can be a bit adventurous.