
PHP 中对象默认按引用传递,直接赋值会使两个变量指向同一内存地址;若需独立副本,必须使用 clone 关键字创建深拷贝,否则对副本的修改将影响原始对象。
php 中对象默认按引用传递,直接赋值会使两个变量指向同一内存地址;若需独立副本,必须使用 `clone` 关键字创建深拷贝,否则对副本的修改将影响原始对象。
在 PHP 中,对象变量存储的并非实际数据,而是指向对象实例的引用(reference)。因此,当执行 $varObjCopy = $varObj; 时,并未创建新对象,而是让 $varObjCopy 指向与 $varObj 相同的对象内存地址。这意味着后续对 $varObjCopy->id 的任何修改,实际上是在操作同一个对象属性,自然会反映在 $varObj->id 上——这正是示例中第二次 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,行为一致。
? 总结:在 PHP 中,“赋值即引用”是对象的默认行为;若目标是保留原对象状态并独立操作副本,请始终使用 clone,而非简单赋值。这是保障数据隔离性与代码可预测性的关键实践。
立即学习“PHP免费学习笔记(深入)”;



















