0

我在使用对象作为其他一些对象的原型时遇到问题。

下面的代码预计会保留对象容器的所有实例(在下面的代码中可见的是 $module1 和 $module2),但是只有最后一个被保留,我认为这是由于我复制原型对象的方式。

我应该以其他方式复制原型吗?

//Create module prototype
        $module = new Container();
        $module->setCompany($currentCompany);
        $module->setContainerType($typeModule);
        $module->setParent($entity);

        //Set the modules in use by this template (structure a bit ugly here, but makes it easier when dealing with the layout on other areas of the app)
        if ($size = $template->getModule1()) {
            $module1 = $module; //copy the prototype
            $module1->setName('Module1'); //Give a unique name
            $module1->setContainerSize($size); //Copy the size from the layoutTemplate
            $em->persist($module1); //Persist this module
            $layout->setModule1($module1); //Connect this container to become a module in the layout
        }

        if ($size = $template->getModule2()) {
            $module2 = $module; //copy the prototype
            $module2->setName('Module2'); //Give a unique name
            $module2->setContainerSize($size); //Copy the size from the layoutTemplate
            $em->persist($module2); //Persist this module
            $layout->setModule2($module2); //Connect this container to become a module in the layout
        }
4

2 回答 2

2

您并没有真正复制对象,您只需为同一个对象创建一个新的变量别名(它们使用相同的底层对象)。这适用于数组,但不适用于对象。

您可以使用clone创建对象的(浅)副本:

$module1 = clone $module;

请记住,尽管 $module 和 $module1 将引用相同的对象。我,如果 ContainerType 是一个对象,$module 和 $module1 将引用同一个 ContainerType 实例,这可能是您想要的,也可能不是。

您可以在此处阅读有关在 PHP5 中克隆的更多信息

于 2012-10-29T10:24:33.787 回答
0

我对此不是 100% 确定的,因为我对这个框架没有任何经验。

但是在您的 if 语句中,您缺少一个等号来比较这些值。

if ($size = $template->getModule1()) {

应该

if ($size == $template->getModule1()) {

您拥有的 if 将始终为真,并且值将在第二个 if 语句中被覆盖。尝试像建议的那样更改这两行,看看是否能解决问题。

于 2012-10-29T10:28:12.340 回答