У меня такая же проблема о создании копии объекта без ссылки в PHP но это решение не работает.
Я хочу взять все элементы коллекции, изменить одно свойство (добавить месяцы) и вставить этот новый элемент в новую коллекцию.
Итак, я использовал clone
для того, чтобы получить совершенно новый экземпляр Invoice
который должен быть затронут только этим случаем, но это не так.
С этим кодом:
while($thisInvoiceYear <= CURRENT_YEAR) {
$clonedInvoice = clone($thisInvoice);
$this->extendedInvoices->push($clonedInvoice);
$toSaveInvoice = $this->extendedInvoices->last();
$thisInvoiceYear = $this->getCurrentYear($toSaveInvoice);
$toSaveInvoice->Schedule->StartDate = Carbon::parse($toSaveInvoice->Schedule->StartDate)->addMonths($period);
unset($clonedInvoice);
}
куда $thisInvoice
является объектом коллекции Invoice, $this->extendedInvoices
является методом класса Invoice.
Проблема в том, что каждое изменение сделано в $toSaveInvoice
также влияет на оригинальный элемент коллекции. После 3 итераций дата одинакова для всех элементов extendedInvoices и не должна быть:
Я использую Laravel 5.2, но я думаю, что нет помощников, чтобы клонировать элемент коллекции.
Ты знаешь почему clone()
не работает? Большое спасибо за вашу помощь.
Хорошая идея — сначала прочитать руководство, а потом задать вопрос по SO.
Создание копии объекта с полностью реплицированными свойствами не всегда является желаемым поведением. Хороший пример необходимости использования конструкторов копирования: если у вас есть объект, представляющий окно GTK, и объект содержит ресурс этого окна GTK, при создании дубликата может потребоваться создать новое окно с такими же свойствами и чтобы новый объект содержал ресурс нового окна. Другой пример: если ваш объект содержит ссылку на другой объект, который он использует, и когда вы реплицируете родительский объект, вы хотите создать новый экземпляр этого другого объекта, чтобы реплика имела свою собственную отдельную копию.
Копия объекта создается с помощью
clone
Ключевое слово (которое вызывает объект__clone()
метод, если это возможно). Объект__clone()
метод не может быть вызван напрямую.
$copy_of_object = clone $object;
Когда объект клонируется, PHP 5 выполнит поверхностную копию всех свойств объекта. Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.
Хотя в руководстве описывается поведение PHP 5, я могу заверить вас, исходя из собственного опыта, что PHP 7 ведет себя так же.
Если вам нужно клонировать что-то еще внутри, внедрите __clone
метод и определить, что именно и как объект должен быть клонирован.
Других решений пока нет …