我不确定这是否是默认行为,但我正在尝试比较Symfony2应用程序中调用$form->submit($data(前后对象的旧数据。
奇怪的是,在表单绑定之后,旧变量也被更新了。
考虑这个代码:
public function editAction(Person $person, Request $request)
{
/**
* Get the current old employment
*/
$currentOldEmployment = $person->getCurrentEmployment();
/*
* Create the form
*/
$form = $this->createForm(new PersonType(), $person);
/**
* Submit the form
*/
$form->submit($data);
if($form->isValid()) {
if($currentEmployment) {
$oldCompany = $currentOldEmployment->getCompany();
$newCompany = $person->getCurrentEmployment()->getCompany();
// compare and trigger something if different
...
}
return View::create($oldCompany->getName() . " " . $newCompany->getName(), 400);
}
奇怪的是,这总是会输出两次新公司的名称。我甚至用$oldPerson=clone$person尝试过,但这也会显示新公司的名称两次,而不是一次显示旧公司,一次显示新公司。
这实际上是PHP5的一个特性。
在PHP4中,对象和其他任何变量一样是按值传递的。将对象指定给变量时,该变量包含一个完整的对象,与原始对象分离。随后,您可以在不修改变量值的情况下修改原始对象。
在PHP5中,对象是通过引用传递的。如果你熟悉"与"运算符,它也会做同样的事情。这是关于通过引用传递的手动输入。
这意味着$currentOldEmployment
变量引用$person
对象,然后通过Symfony表单提交对其进行修改。要在修改对象后保留这些旧值,可以通过$currentOldEmployment = clone $person->getCurrentEmployment()
对对象进行clone
。这有效地创建了对象在该时刻的快照。阅读PHP5中有关对象克隆的手动条目中的更多信息。