我对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
进行分析时,$lesRes
中的所有$res
都是相同的。数据库中的注册数据还不同...
我怎样才能拥有一个带有不喜欢$res
的数组?
(如果我请求将刚刚添加到数据库中的项目放在数据库中,我会遇到同样的问题,我有一个 x 元素数组$res
,它们都是相同的。
我想$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
和循环期间创建的所有Reservation
对象的成员$dateDebut
访问。另一个实例是$DateFin
,同样的讨论也适用于它。
您的代码是变量别名的受害者。
如何解决:
您需要在循环代码(并将副本传递给Reservation::setDateDebut()
(或Reservation::setDateDebut()
的主体中在某处创建$DateDebut
的副本:
// Either
$res->setDateDebut(clone $DateDebut->add(new 'DateInterval('P1D')));
// Or
public function setDateDebut(DateTime $dateDebut)
{
$this->dateDebut = clone $dateDebut;
}
您可以决定在哪里最合适的位置执行此操作,具体取决于代码的其余部分如何处理这些对象。
因为您在循环中更改了$DateDebut
的值,所以您应该在那里复制该对象。
如果类Reservation
更改其$dateDebut
成员的值,则还应(也(在setter方法中克隆它。这是因为 Reservation::setDateDebut()
的调用方不希望 Reservation
类对其作为参数传递的值进行更改。