PHP对象克隆

介绍

通过简单的分配创建对象的副本只会在内存中创建对该对象的另一个引用。因此,属性的更改会同时反映在原始对象和重复对象中。PHP具有clone关键字,该关键字创建对象的浅表副本。但是,如果原始对象具有其他嵌入对象作为其属性之一,则复制的对象仍然引用相同的对象。要创建对象的eep复制,需要在class /中定义魔术方法__clone()

按作业复制

在下面的代码中,myclass具有属性之一作为地址类的对象。myclass的对象通过分配来复制。其所有权值的变化反映在两个对象中

示例

<?php
class address{
   var $city="Nanded";
   var $pin="431601";
   function setaddr($arg1, $arg2){
      $this->city=$arg1;
      $this->pin=$arg2;
   }
}
class myclass{
   var $name="Raja";
   var $obj;
   function setname($arg){
      $this->name=$arg;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object\n";
print_r($obj1);
$obj2=$obj1;
$obj1->setname("Ravi");
echo "after change:\n";
print_r($obj1);
print_r($obj2);
?>

输出结果

此代码显示以下输出

original object
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )
)
after change:
original object
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )
)
copied object
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)

使用克隆关键字

克隆关键字创建一个浅表副本。属性值的更改不会反映在克隆的对象中。但是,如果修改了嵌入式对象,则更改会反映在原始对象和克隆对象中

示例

<?php
class address{
   var $city="Nanded";
   var $pin="431601";
   function setaddr($arg1, $arg2){
      $this->city=$arg1;
      $this->pin=$arg2;
   }
}
class myclass{
   var $name="Raja";
   var $obj;
   function setname($arg){
      $this->name=$arg;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?>

输出结果

输出显示以下结果

original object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)
after change:
original object:
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Mumbai
      [pin] => 400001
   )

)
cloned object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Mumbai
      [pin] => 400001
   )

)

使用__clone()方法

 __clone()方法创建唯一的嵌入对象的太创建深副本的

示例

<?php
class address{
   var $city="Nanded";
   var $pin="431601";
   function setaddr($arg1, $arg2){
      $this->city=$arg1;
      $this->pin=$arg2;
   }
}
class myclass{
   var $name="Raja";
   var $obj;
   function setname($arg){
      $this->name=$arg;
   }
   public function __clone() {
      $this->obj = clone $this->obj ;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?>

输出结果

输出显示以下结果

original object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)
after change:
original object:
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Mumbai
      [pin] => 400001
   )

)
cloned object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)