
PHP 中对象默认按引用传递,直接赋值会使两个变量指向同一内存地址;若需独立副本,必须使用 clone 关键字创建浅拷贝,否则修改副本将同步影响原对象。
php 中对象默认按引用传递,直接赋值会使两个变量指向同一内存地址;若需独立副本,必须使用 `clone` 关键字创建浅拷贝,否则修改副本将同步影响原对象。
在 PHP 中,对象变量存储的并非数据本身,而是指向对象实例的引用(reference)。因此,当执行 $varObjCopy = $varObj; 时,并未创建新对象,而只是让 $varObjCopy 指向与 $varObj 相同的对象内存地址。这意味着对 $varObjCopy 的任何属性修改,都会直接反映在 $varObj 上——这正是你观察到 var_dump($varObj->id) 第二次输出 4 的根本原因。
✅ 正确做法:使用 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()魔术方法并手动克隆子对象。 - 对于标准对象(如
(object) [...]),clone已足够满足大多数简单复制需求。 - 不要依赖
json_encode/json_decode或序列化方式“模拟”克隆——它们会丢失对象方法、资源句柄及私有/受保护属性可见性,且性能更低。
? 总结:在 PHP 中,“赋值即引用”是对象行为的核心特性。牢记——要副本,必克隆;仅靠赋值无法隔离对象状态。这是避免意外副作用、保障数据一致性的基本实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











