Вот моя лучшая практика по массиву объектов и клонированию.Обычно хорошей идеей является наличие класса Collection для каждого класса объектов (или интерфейса), которые используются в массиве.С волшебной функцией __clone
клонирование становится формализованной процедурой:
class Collection extends ArrayObject
{
public function __clone()
{
foreach ($this as $key => $property) {
$this[$key] = clone $property;
}
}
}
Чтобы клонировать ваш массив, используйте его как коллекцию, а затем клонируйте его:
$arrayObject = new Collection($myArray);
$clonedArrayObject = clone $arrayObject;
На шаг впередследует добавить метод клонирования в ваш класс и каждый подкласс тоже.Это важно для глубокого клонирования, или у вас могут быть непреднамеренные побочные эффекты:
class MyClass
{
public function __clone()
{
$this->propertyContainingObject = clone $this->propertyContainingObject;
}
}
Важное замечание по использованию ArrayObject заключается в том, что вы больше не можете использовать is_array()
.Так что учтите это при рефакторинге вашего кода.