如何不通过引用传递PHP对象

如何不通过引用传递PHP对象,php,pass-by-reference,Php,Pass By Reference,在PHP中,对象通过引用自动传递: $obj1 = new stdClass(); $obj1->foo = 'bar'; $obj2 = $obj1; $obj2->foo = 'OOF'; var_dump($obj1->foo); // OOF 有没有一种优雅的方法可以复制该变量而不引用原始变量?我想存储一个对象的副本,然后在不影响原始对象的情况下对其进行修改。谢谢。您可以选择以下对象: $obj2 = clone $obj1; 请注意,$obj2将是$obj1的浅拷

在PHP中,对象通过引用自动传递:

$obj1 = new stdClass();
$obj1->foo = 'bar';
$obj2 = $obj1;
$obj2->foo = 'OOF';
var_dump($obj1->foo); // OOF
有没有一种优雅的方法可以复制该变量而不引用原始变量?我想存储一个对象的副本,然后在不影响原始对象的情况下对其进行修改。谢谢。

您可以选择以下对象:

$obj2 = clone $obj1;
请注意,
$obj2
将是
$obj1
的浅拷贝。如PHP手册所述:

克隆对象时,PHP5将对所有对象执行浅拷贝 对象的属性。引用其他属性的任何属性 变量将保留为引用


如果愿意,您可以覆盖
\u clone()
方法来手动克隆任何子对象。

只需克隆它!为什么?按值传递对象有什么意义?顺便说一句:对象并不是通过引用传递的,而是通过对象标识符传递的。假设您创建了一个对象,该实例存储在内存中并分配了一个id(例如123),传递该实例实际上通过值传递该id,然后调用的函数/方法使用标识符检索该对象。参考略有不同:
$x=newstdclass$y=&$x$y=null;var_dump(x美元)
将转储
null
“为什么?”@emersonthis:Yes和no。如果您不需要每个属性,并克隆一个实例(相对昂贵),然后取消设置一些属性,那么您违反了SRP。您正在记录的对象已经完成了它的工作,并且必须知道应该记录哪些属性。相反,我会创建一个日志格式化程序或处理器,过滤掉我不想/不需要记录的内容。这样,我就不会在内存中保存一个对象的两个副本,日志和业务逻辑之间也不会有同样的紧密耦合。我不知道这件事。谢谢你,维克多+1软件不会克隆存储在克隆对象属性中的对象。您需要通过
\u clone
@Torben显式克隆它们。克隆对象的属性时会发生什么情况?它们只是消失在副本中吗?或者他们可能会切换到
null
?我做了一个快速测试,看起来对象属性被复制了。也许我误解了托本的评论。@emersonthis:是的,包含对象的属性仍然会通过标识符系统使用相同的访问权限。要递归地克隆对象,您必须自己实现magic
\uu clone
方法,手动迭代对象的属性,并克隆它们