我有php变量的问题。我使用的代码如下:
for($i = 0; $i <= $nbRecurrence; $i++) {
$res = new Reservation();
$res->setDateDebut($DateDebut->add(new \DateInterval('P1D')));
$res->setDateFin($DateFin->add(new \DateInterval('P1D')));
$lesRes[] = $res;
$this->app['orm.ems']['gestionReservationAuto']->persist($res);
$this->app['orm.ems']['gestionReservationAuto']->flush();
}
问题是虽然我添加了数组中的每个元素,但是当我使用var_dump
进行分析时,$res
中的所有$lesRes
都是相同的。注册数据在数据库中有所不同......
如何让$res
的数组不喜欢?
(如果我发出请求将我刚刚添加到数据库中的项目,我有同样的问题,我有一个x元素$res
的数组,它们都是相同的。)
答案 0 :(得分:1)
我猜$DateDebut
是DateTime
个对象。
我还猜测Reservation::setDateDebut()
看起来像:
class Reservation
{
private $dateDebut;
public function setDateDebut(DateTime $dateDebut)
{
$this->dateDebut = $dateDebut;
}
}
让我们再次写下使用它的代码:
$res = new Reservation();
$res->setDateDebut($DateDebut->add(new \DateInterval('P1D')));
您错过的是DateTime::add()
不创建新的DateTime
对象但返回对当前对象的引用(即return $this;
)。
这意味着在每次迭代时你都会更改对象$DateDebut
的值,然后将其传递给Reservation::setDateDebut()
,而DateTime
也不会复制它,只是链接到它获取的对象参数。
在循环之后,您仍然只有两个$DateDebut
个实例;其中一个可以通过变量$dateDebut
和循环期间创建的所有Reservation
个对象的成员$DateFin
访问。另一个例子是$DateDebut
,同样的讨论对它也有效。
您的代码是variables aliasing的受害者。
您需要在循环代码中创建Reservation::setDateDebut()
的副本(并将副本传递给Reservation::setDateDebut()
)或// Either
$res->setDateDebut(clone $DateDebut->add(new \DateInterval('P1D')));
// Or
public function setDateDebut(DateTime $dateDebut)
{
$this->dateDebut = clone $dateDebut;
}
的正文:
$DateDebut
您可以根据代码的其余部分如何使用这些对象来确定最合适的位置。
因为您在循环中更改了Reservation
的值,所以您应该在那里复制对象。
如果类$dateDebut
更改其Reservation::setDateDebut()
成员的值,那么您应该(也)在setter方法中克隆它。这是因为Reservation
的调用者不希望{{1}}类对它作为参数传递的值进行更改。