PHP类中如何保留对象旧值 赋值后修改是否必须创建独立实例?
问题原因
PHP中对象变量默认保存的是对象的引用标识符,$var2 = $var1的操作只是将同一个对象的引用赋值给了$var2,两个变量本质指向内存中的同一个实例,因此修改任意一个变量的对象属性,另一个也会同步生效。
解决方案
不需要必须手动创建两个完全独立的类实例,你可以用PHP提供的clone关键字直接复制已有实例,得到的新实例和原实例初始状态完全一致,后续修改互不影响:
$var1 = new Class(['name' => 'Jeff Bezos']); $var2 = clone $var1; // 克隆得到独立的新实例 $var1->updateMyObject(['name' => 'Elon Musk']); // 此时$var2->name仍为Jeff Bezos
如果你的类内部包含引用类型的属性(比如其他对象实例、数组引用等),浅克隆可能还会出现属性联动修改的问题,这种时候可以在类中定义__clone()魔术方法自定义克隆逻辑,实现深克隆:
class YourClass { public $name; public $relatedObject; public function __construct($params) { $this->name = $params['name']; $this->relatedObject = new StdClass(); } public function updateMyObject($params) { $this->name = $params['name']; } // 自定义克隆逻辑,实现深克隆 public function __clone() { // 对引用类型的属性也执行克隆 $this->relatedObject = clone $this->relatedObject; } }
当然如果初始化逻辑本身很简单,直接两次new创建独立实例也是完全可行的方案,两种方式都可以满足你的需求。
内容的提问来源于stack exchange,提问作者Valentin Leguy
相关产品推荐
相关产品推荐

