клонирование — клонирование объекта PHP не работает

У меня такая же проблема о создании копии объекта без ссылки в 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() не работает? Большое спасибо за вашу помощь.

-2

Решение

Хорошая идея — сначала прочитать руководство, а потом задать вопрос по SO.

От Руководство по PHP:

Создание копии объекта с полностью реплицированными свойствами не всегда является желаемым поведением. Хороший пример необходимости использования конструкторов копирования: если у вас есть объект, представляющий окно GTK, и объект содержит ресурс этого окна GTK, при создании дубликата может потребоваться создать новое окно с такими же свойствами и чтобы новый объект содержал ресурс нового окна. Другой пример: если ваш объект содержит ссылку на другой объект, который он использует, и когда вы реплицируете родительский объект, вы хотите создать новый экземпляр этого другого объекта, чтобы реплика имела свою собственную отдельную копию.

Копия объекта создается с помощью clone Ключевое слово (которое вызывает объект __clone() метод, если это возможно). Объект __clone() метод не может быть вызван напрямую.

$copy_of_object = clone $object;

Когда объект клонируется, PHP 5 выполнит поверхностную копию всех свойств объекта. Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.

Хотя в руководстве описывается поведение PHP 5, я могу заверить вас, исходя из собственного опыта, что PHP 7 ведет себя так же.

Если вам нужно клонировать что-то еще внутри, внедрите __clone метод и определить, что именно и как объект должен быть клонирован.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector