
PHP 中对象变量默认按引用传递,直接赋值会使两个变量指向同一内存地址,修改副本会同步影响原对象;需使用 clone 关键字创建独立副本,避免意外的数据污染。
php 中对象变量默认按引用传递,直接赋值会使两个变量指向同一内存地址,修改副本会同步影响原对象;需使用 `clone` 关键字创建独立副本,避免意外的数据污染。
在 PHP 中,对象(object)与其他标量类型(如 int、string、array)有本质区别:对象变量存储的是对象的引用(reference),而非值本身。这意味着当你执行 $varObjCopy = $varObj; 时,并未创建新对象,而是让 $varObjCopy 指向与 $varObj 完全相同的内存地址。因此,对 $varObjCopy->id 的修改,实质上是修改了该共享对象的属性——这正是你观察到 var_dump($varObj->id) 从 20 变为 4 的根本原因。
✅ 正确做法:使用 clone 创建对象的浅拷贝clone 关键字会生成原对象的一个独立副本(即新实例),其属性值初始与原对象一致,但二者内存隔离,互不影响:
$varObj = (object) ['id' => '20', 'title' => 'Test ID 20', 'product' => '4']; var_dump($varObj->id); // 输出: string(2) "20" $varObjCopy = clone $varObj; // ✅ 关键修正:显式克隆 $varObjCopy->id = $varObj->product; var_dump($varObj->id); // 输出: string(2) "20"(保持不变) var_dump($varObjCopy->id); // 输出: string(1) "4"(仅副本被修改)
⚠️ 注意事项:
-
clone执行的是浅拷贝(shallow copy):若对象属性中包含其他对象或资源,这些嵌套对象仍以引用方式共享。如需完全隔离(深拷贝),需在类中定义__clone()魔术方法并手动克隆嵌套对象。 - 对于
stdClass实例(如本例中(object) [...]创建的对象),clone已足够满足基本需求,无需额外实现__clone()。 - 切勿依赖
json_encode()/json_decode()或序列化方式“模拟”克隆——它们会丢失对象方法、类型信息及资源句柄,且性能较差。
? 总结:
PHP 的对象引用语义是设计使然,而非 Bug。理解并正确使用 clone 是安全操作对象副本的前提。始终牢记:赋值不等于复制,clone 才是真正的对象拷贝操作。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











