php __clone () и "мелкий клон" - PullRequest
7 голосов
/ 27 апреля 2011

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

Ответы [ 2 ]

8 голосов
/ 27 апреля 2011

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

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

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

3 голосов
/ 27 апреля 2011

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

Чтобы создать копии без ласточки, вы должны реализовать __clone(). Это вызывается на клонированном объекте после клонирования.

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