Может кто-то объяснять меня
что Объект Клонирует в php?
Когда я должен использовать ключевое слово клона в php?
Объект клонирование - это акт создания копии объекта. Как указал 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
возвращает клон адреса-объекта для вызова объектов. Это означает, что если вызывающий объект изменяет адрес адреса, внутренний адрес пользователя не изменится. Если вы не дали клону, то внешний объект будет , сможет изменять внутренний адрес пользователя, поскольку ссылка дана по умолчанию, а не клоном.
Надеюсь, все это имеет смысл.
.:
Будьте в курсе, хотя, если адрес также будут иметь внутренние объекты, вам придется убедиться, что адрес делает глубокую копию самого клонирования (согласно моему второму примеру этого поста), определяя __ клон ()
в адресе. В противном случае вы получите головные боли пытаться выяснить, почему ваши данные прикручены.
Клонирование объекта С точки зрения PHP 5, это то, что известно как «неглубокая копия» . Затем он называет метод __CLONE () на клонированном объекте.
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"
}