php __clone() и «мелкий клон»

#php #clone

#php #клонировать

Вопрос:

Что подразумевается, когда результаты __clone() являются «мелким клоном»?

Ответ №1:

Это означает, что при клонировании объекта любые свойства, являющиеся ссылочными переменными (переменные, которые ссылаются на другие объекты, а не на значение), останутся ссылками.

«Неглубокий» клон установил бы для нового объекта значения этих свойств, вместо того, чтобы оставлять их в качестве ссылок.

Примечание: Это означает, что любые изменения, которые вы вносите в эти ссылки в клонированном объекте, также будут внесены в значения, на которые они ссылаются в «родительском» объекте.

Комментарии:

1. «Примечание» неверно: только каждое изменение свойства / значения клонированного объекта, то есть ссылки, повлияет на исходный объект. примитивные типы никогда не являются ссылками, и если вы замените один объект другим, это также повлияет только на один объект, но не на другой.

2. Да, это то, что я имел в виду. Уточняется.

Ответ №2:

Короче говоря: в клоне останутся те же ссылки, что и в исходном объекте, из которого он клонирован. Примитивные типы, такие как strings или integer, никогда не являются ссылками (в php), и если вы полностью измените одну ссылку (заменив объект свойства другим), это также не повлияет на исходный объект. Каждое свойство будет содержать тот же, а не только идентичный объект, что и свойство с тем же именем другого объекта.

Для создания копий без проглатывания вы должны реализовать __clone() . Это вызывается для клонированного объекта после клонирования.

 public function __clone () {
  $this->myObject = clone $this->myObject;
  // and so on
}