0

オブジェクトを他のオブジェクトのプロトタイプとして使用する際に問題があります。

以下のコードは、オブジェクト Container のすべてのインスタンスを永続化することが期待されています (以下のこのコードで表示されているのは $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 ステートメントでは、値を比較するための等号が 1 つ欠けています。

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

する必要があります

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

あなたが持っているifは常に真であり、値は2番目のifステートメントで上書きされます。提案されているようにこれらの行の両方を変更してみて、問題が解決するかどうかを確認してください。

于 2012-10-29T10:28:12.340 に答える