2016-08-06 14 views
-2

私は同じポブレムabout making a copy of an object without reference in PHPを持っていますが、その解決策は機能していません。PHPオブジェクトの複製が機能しません

私はコレクションのすべての要素を取り上げ、1つのプロパティを変更し(月を追加する)、新しい要素を新しいコレクションにプッシュしたいと考えています。

私はcloneを使用して、そのインスタンスに影響を受けるはずのInvoiceの全く新しいインスタンスを取得しましたが、そうではありません。 $thisInvoice請求書コレクションの対象となる

while($thisInvoiceYear <= CURRENT_YEAR) { 
    $clonedInvoice = clone($thisInvoice); 
    $this->extendedInvoices->push($clonedInvoice); 
    $toSaveInvoice = $this->extendedInvoices->last(); 
    $thisInvoiceYear = $this->getCurrentYear($toSaveInvoice); 
    $toSaveInvoice->Schedule->StartDate = Carbon::parse($toSaveInvoice->Schedule->StartDate)->addMonths($period); 
    unset($clonedInvoice); 
} 

$this->extendedInvoicesクラス書の方法であって、このコードの

$toSaveInvoiceで行われたすべての変更が元のコレクション要素にも影響するという問題があります。 3回の反復の後、日付がextendedInvoicesのすべての要素に対して同じであるとすべきではない:

enter image description here

私はLaravel 5.2を使用していますが、私は、コレクションの要素をクローニングするヘルパーは存在しないと思います。

なぜclone()が機能していないのですか?あなたの助けに感謝します。

+2

クローンは「シャロークローン」を実行する可能性があります。 「深いクローン」を行うためにカスタムマジック '__clone'メソッドを提供する必要があるかもしれません(つまり、Invoiceオブジェクト内のすべてのネストされたオブジェクトを複製する) –

+1

良い例はここです:http://php.net/manual/en/language .oop5.cloning.php – dMd

答えて

1

最初にマニュアルを読んで、後でその質問をすることをお勧めします。 PHP manualから

完全に複製されたプロパティを持つオブジェクトのコピーを作成するには、常に望ましい動作ではありません。コピーコンストラクタの必要性の良い例は、GTKウィンドウを表すオブジェクトがあり、そのオブジェクトがこのGTKウィンドウのリソースを保持している場合です。同じプロパティを持つ新しいウィンドウを作成したい場合や、新しいオブジェクトに新しいウィンドウのリソースを保持させます。もう1つの例は、オブジェクトが使用する別のオブジェクトへの参照を保持していて、親オブジェクトを複製するときに、この他のオブジェクトの新しいインスタンスを作成するときに、複製が独自のコピーを持つようにする場合です。

cloneキーワード(できるだけオブジェクトの__clone()メソッドを呼び出す)を使用してオブジェクトコピーを作成します。オブジェクトの__clone()メソッドを直接呼び出すことはできません。オブジェクトが複製される

$copy_of_object = clone $object;

、PHP 5は、オブジェクトのすべてのプロパティの簡易コピーを実行します。他の変数への参照であるプロパティはすべて参照のままです。

このマニュアルではPHP 5の動作について説明していますが、自分の経験から、PHP 7も同じように動作することを保証できます。

他のものでクローンを作成する必要がある場合は、__cloneメソッドを実装して、オブジェクトを正確にどのようにクローンする必要があるかを定義します。

関連する問題