что Объект Клонирует в php?

Может кто-то объяснять меня

  • что Объект Клонирует в php?

  • Когда я должен использовать ключевое слово клона в php?

39
задан 27 January 2010 в 04:07
поделиться

3 ответа

Объект клонирование - это акт создания копии объекта. Как указал CODY , клонирование в PHP осуществляется путем изготовления неглубокой копии объекта. Это означает, что внутренние объекты клонированного объекта не могут быть клонированы , если вы не указали объекта клонировать эти внутренние объекты тоже, определив метод Magic __ клон () .

Если вы не используете метод __ клона , внутренние объекты нового объекта будут ссылаться на то же objecs в памяти как внутренние объекты исходного объекта, который был клонирован.

Рассмотрим эти примеры:

// in this exampe the internal member $_internalObject of both objects
// reference the same instance of stdClass in memory.
class CloneableClass
{
    private $_internalObject;

    public function __construct()
    {
        // instantiate the internal member
        $this->_internalObject = new stdClass();
    }
}

$classA = new CloneableClass();
$classB = clone $classA;


// in this exampe the internal member $_internalObject of both objects
// DON'T reference the same instance of stdClass in memory, but are inividual instances
class CloneableClass
{
    private $_internalObject;

    public function __construct()
    {
        // instantiate the internal member
        $this->_internalObject = new stdClass();
    }

    // on clone, make a deep copy of this object by cloning internal member;
    public function __clone()
    {
        $this->_internalObject = clone $this->_internalObject;
    }
}

$classA = new CloneableClass();
$classB = clone $classA;

Использование случаев для клонирования, например, является случай, когда вы не хотите, чтобы внешние объекты беспокоились с внутренним состоянием объекта.

Допустим, у вас есть классный пользователь с внутренним объектом адресом.

class Address
{
    private $_street;
    private $_streetIndex;
    private $_city;
    // etc...

    public function __construct( $street, $streetIndex, $city /* etc.. */ )
    {
        /* assign to internal values */
    }
}

class User
{
    // will hold instance of Address
    private $_address;

    public function __construct()
    {
        $this->_address = new Address( 'somestreet', '1', 'somecity' /* etc */ );
    }

    public function getAddress()
    {
        return clone $this->_address;
    }
}

Для аргументов Сайк, давайте скажем, вы не хотите, чтобы вы не хотите, чтобы вы не хотите, чтобы вы не хотите беспокоиться с внутренним адресом объектов пользователей, но вы хотите, чтобы иметь возможность дать им копию адресной объекта. Приведенный выше пример иллюстрирует это. Метод MetAddress возвращает клон адреса-объекта для вызова объектов. Это означает, что если вызывающий объект изменяет адрес адреса, внутренний адрес пользователя не изменится. Если вы не дали клону, то внешний объект будет , сможет изменять внутренний адрес пользователя, поскольку ссылка дана по умолчанию, а не клоном.

Надеюсь, все это имеет смысл.

.:
Будьте в курсе, хотя, если адрес также будут иметь внутренние объекты, вам придется убедиться, что адрес делает глубокую копию самого клонирования (согласно моему второму примеру этого поста), определяя __ клон () в адресе. В противном случае вы получите головные боли пытаться выяснить, почему ваши данные прикручены.

39
ответ дан 27 November 2019 в 02:29
поделиться

Клонирование объекта С точки зрения PHP 5, это то, что известно как «неглубокая копия» . Затем он называет метод __CLONE () на клонированном объекте.

7
ответ дан 27 November 2019 в 02:29
поделиться

Cloning используется для создания натуральной копии объекта. Назначение объекта к другой переменной не создает копию - скорее, он создает ссылку на то же местоположение памяти, что и объект:

<?php

$o= new stdclass;
$o->a= 'b';
$o->b= 'c';

$o2= $o;
$o2->a= 'd';

var_dump($o);
var_dump($o2);

$o3= clone $o;
$o3->a= 'e';
var_dump($o);
var_dump($o3);

?>

Этот пример код выведет следующее:

object(stdClass)#1 (2) {
  ["a"]=>
  string(1) "d"
  ["b"]=>
  string(1) "c"
}
object(stdClass)#1 (2) {
  ["a"]=>
  string(1) "d"
  ["b"]=>
  string(1) "c"
}
object(stdClass)#1 (2) {
  ["a"]=>
  string(1) "d"
  ["b"]=>
  string(1) "c"
}
object(stdClass)#2 (2) {
  ["a"]=>
  string(1) "e"
  ["b"]=>
  string(1) "c"
}
27
ответ дан 27 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: