You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:15:03