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 ) )

