oop — редактирование клона объекта влияет на оригинальный объект

Итак, у меня есть объект, назовем его Пример.

class Example {
public function __construct ($id) {
$this->Id = $id;
}
}

$objectA = new Example(10);

У него есть идентификатор (он извлекает его откуда-то), цель объекта — переписать аналогичный объект со свойствами этого объекта (публикация во внешнем сервисе). Это делается путем простого изменения идентификатора объекта и запуска метода -> update (). Однако он должен сначала изменить свой идентификатор (среди других свойств), чтобы он соответствовал идентификаторам объекта B.

Поэтому я клонирую текущий объект, переназначаю необходимые свойства, а затем передаю этот клонированный метод методу обновления, чтобы метод обновления использовал значения $ post для обновления.

public function createPost ($id) {
$post = clone $this;
$post->Id = $id;
return $post;
}

$objectA->update($objectA->createPost(12));
$objectA->update($objectA->createPost(16));
$objectA->update($objectA->createPost(21));

У меня проблема в том, что этот объект A нужно использовать для нескольких различных обновлений, и он использует идентификатор, которому он изначально присвоен, в качестве указателя на то, какие идентификаторы он должен позже использовать для $ post, и в этом сценарии значение $ this-> ID переназначается на $ id, который передается в -> setParameters (), хотя я пытаюсь присвоить его клону $ this, а не самому $ this.

У меня сложилось впечатление, что $ objectA = $ objectB назначает ObjectB тому же указателю, который указывает на ObjectA, но этот «клон» должен был на самом деле сделать копию этого объекта, так что если свойства клона изменятся, исходный объект останется без изменений, но, похоже, это не так. Есть ли какой-то конкретный метод, который я должен использовать вместо этого, чтобы гарантировать, что значение исходного объекта никогда не изменяется, когда его клон?

0

Решение

Я думаю, что вы хотите, это глубокий клон. Взгляните на это ссылка на сайт.

1

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

Проблема, с которой я столкнулся, была мелкой проблемой клонирования.

Забудьте то, на что я ссылался выше, проблема была в следующем:

class Example {

public function __construct ($id) {
$this->ObjId = (object)array("Id" => 5);
$this->Id = $id;
}

}

$example = new Example (5);
$clone = clone $example;
$clone->ObjId->Id = 10;

В этом примере я пытался изменить -> Id стандартного объекта php, который хранился в моем основном объекте (я использовал json_encode, чтобы получить целую структуру объектов), который назывался «Id». Результатом вышесказанного было следующее:

echo $example->ObjId->Id; //10
echo $example->Id; //5

echo $clone->ObjId->Id; //10
echo $clone->Id; //5

Поэтому мне пришлось написать этот метод как часть класса Example:

public function __clone () {
foreach ($this as $key => $val) {
if (is_object($val) || (is_array($val))) {
$this->{$key} = unserialize(serialize($val));
}
}
}

Итак, теперь результат был такой:

echo $example->ObjId->Id; //5
echo $example->Id; //5

echo $clone->ObjId->Id; //10
echo $clone->Id; //5

Это потому, что когда я клонировал основной объект Example, он создавал новую переменную для своих свойств, но если одним из его свойств был объект или массив, он копировал адрес этого объекта или массива для нового клонированного объекта. Вышеуказанный метод предотвращает это и делает «глубокую» копию.

0

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