PHP 对象克隆

phpserver side programmingprogramming更新于 2025/8/19 20:52:17

简介

通过简单的赋值创建对象的副本只会在内存中创建对原对象的引用。因此,属性的更改会同时反映在原始对象和副本对象中。PHP 具有 clone 关键字,用于创建对象的浅拷贝。但是,如果原始对象包含其他嵌入对象作为其属性之一,则复制的对象仍然引用该对象。要创建对象的深拷贝,需要在类中定义魔术方法 __clone()。

通过赋值复制

在下面的代码中,myclass 具有 address 类对象的一个​​属性。通过赋值复制了 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
"; print_r($obj1); $obj2=$obj1; $obj1->setname("Ravi"); echo "after change:
"; 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
   )

)

使用 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;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:
"; print_r($obj1); $obj2=clone $obj1; $obj1->setname("Ravi"); $obj1->obj->setaddr("Mumbai", "400001"); echo "after change:
"; echo "original object:
"; print_r($obj1); echo "cloned object:
"; 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:
"; print_r($obj1); $obj2=clone $obj1; $obj1->setname("Ravi"); $obj1->obj->setaddr("Mumbai", "400001"); echo "after change:
"; echo "original object:
"; print_r($obj1); echo "cloned object:
"; 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
   )

)

相关文章