3

所以我遇到了一个奇怪的问题,即函数不是通过引用参数传递来定义的,但是对象正在以我无法解释的方式进行更改。我已经验证函数定义不会一次又一次地通过引用。我从数据库中检索了一个对象。然后我在那个初始对象上运行了一个分析函数。我已将该对象复制到另一个变量。然后我在副本而不是原件上运行不同的分析功能。运行第二个分析函数似乎改变了第一个变量对象。关于这里可能发生的事情的任何想法。我一直在尝试调试这个几个小时,但我无法解释这种行为。我不想发布实际功能,因为它们是专有信息,但是,我可以私下发送它们以寻求帮助。

//get object from db
$resp= json_decode($ln->getResponseFromDb($resultid)); 

//run pwf analysis function
$resp = $ln->pwfBGCheck($resp);

//show result after pwf
print_r($resp->pwf);

/* shows
* stdClass Object ( [status] => p [reason] => Person has no c record. ) 
*/ 

//copy to another variable
$r2 = $resp;
//run pwf for s record other variable so it is not touching the first one!
$r2 = $ln->pwfBGCheckSexOffender2($r2);
echo '<BR>this is first variable<BR>';
print_r($resp->pwf);
/* copies from second to first for some reason... no pass by reference on this call...       resp variable has not been touched!
* stdClass Object ( [status] => p [reason] => Person has no s record. ) 
*/ 
echo '<BR>this is second<BR>';
print_r($r2->pwf);
/* returns
* stdClass Object ( [status] => p [reason] => Person has no s record. )
*/
4

3 回答 3

6

由于 PHP5 对象总是通过引用传递。如果要获取对象的副本,则必须使用clone

对象和参考

PHP 中通常的按值赋值行为的一个例外发生在对象上,在 PHP 5 中通过引用进行赋值。对象可以通过 clone 关键字显式复制。

赋值运算符

于 2013-11-01T02:22:30.830 回答
2

您也可以使用json_decode($json, true);(而不是json_decode($json);) 来获取 assoc array(而不是stdClass)。

并且参考文献不会有任何问题。

于 2013-11-01T04:03:25.217 回答
0

在永远疯狂之后......我找到了这个解决方案:

$r2 = unserialize(serialize($resp));

我知道这并不理想,因为会影响性能,但我在最后期限之前,需要尽快创建一个可行的解决方案。我相信这个问题仍然存在,因为即使是被复制的变量也是通过引用传递的。如果有人提出更好的选择,我愿意接受另一种可行的解决方案。谢谢!

也...由于序列化的其他一些问题(libxml无法序列化),这个解决方案不起作用......但后来我想到了

$r2 = json_decode(json_encode($resp));

这实际上成功了!

于 2013-11-01T03:35:15.100 回答