数组中的解离变量

时间:2015-02-24 09:07:02

标签: php variables silex

我有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的数组,它们都是相同的。)

1 个答案:

答案 0 :(得分:1)

我猜$DateDebutDateTime个对象。 我还猜测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}}类对它作为参数传递的值进行更改。