#php #clone
#php #клонировать
Вопрос:
Что подразумевается, когда результаты __clone() являются «мелким клоном»?
Ответ №1:
Это означает, что при клонировании объекта любые свойства, являющиеся ссылочными переменными (переменные, которые ссылаются на другие объекты, а не на значение), останутся ссылками.
«Неглубокий» клон установил бы для нового объекта значения этих свойств, вместо того, чтобы оставлять их в качестве ссылок.
Примечание: Это означает, что любые изменения, которые вы вносите в эти ссылки в клонированном объекте, также будут внесены в значения, на которые они ссылаются в «родительском» объекте.
Комментарии:
1. «Примечание» неверно: только каждое изменение свойства / значения клонированного объекта, то есть ссылки, повлияет на исходный объект. примитивные типы никогда не являются ссылками, и если вы замените один объект другим, это также повлияет только на один объект, но не на другой.
2. Да, это то, что я имел в виду. Уточняется.
Ответ №2:
Короче говоря: в клоне останутся те же ссылки, что и в исходном объекте, из которого он клонирован. Примитивные типы, такие как strings или integer, никогда не являются ссылками (в php), и если вы полностью измените одну ссылку (заменив объект свойства другим), это также не повлияет на исходный объект. Каждое свойство будет содержать тот же, а не только идентичный объект, что и свойство с тем же именем другого объекта.
Для создания копий без проглатывания вы должны реализовать __clone()
. Это вызывается для клонированного объекта после клонирования.
public function __clone () {
$this->myObject = clone $this->myObject;
// and so on
}