数组中分离的变量


dissociated variables in array

我对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 类对其作为参数传递的值进行更改。