我不确定这是否是默认行为,但我在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,但这也显示了新公司的名称两次,而不是旧公司的名称和新公司的名称。
答案 0 :(得分:1)
这实际上是PHP 5的一个功能。
在PHP 4中,对象按值传递,就像任何其他变量一样。将对象分配给变量时,该变量包含一个完整对象,与原始对象分开。您可以随后修改原始对象而不修改变量的值。
在PHP 5中,对象通过引用传递。如果您熟悉&号运算符,它也会做同样的事情。以下是通过引用传递的manual entry。
这意味着您的$currentOldEmployment
变量会引用$person
对象,然后您通过Symfony表单提交修改该对象。要在修改对象后保留这些旧值,您可以clone
通过$currentOldEmployment = clone $person->getCurrentEmployment()
Cerad说明{{1}}对象。这有效地在该时刻创建了对象的快照。阅读PHP5中对象克隆的manual entry中的更多信息。