2016-08-06 2 views
-2

동일한 포블을 ​​가지고 있습니다 (about making a copy of an object without reference in PHP).하지만 해결 방법이 효과가 없습니다.PHP 객체 복제가 작동하지 않습니다.

컬렉션의 모든 요소를 ​​가져 와서 하나의 속성 (월 추가)을 변경하고 새 요소를 새 컬렉션으로 푸시하고 싶습니다.

따라서 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의 모든 요소에 대해 동일이 아니어야합니다 : 나는 Laravel 5.2을 사용하고

enter image description here

,하지만 난 컬렉션의 요소를 복제하는 헬퍼가없는 생각합니다.

clone()이 작동하지 않는 이유를 알고 계십니까? 도와 주셔서 정말로 고맙습니다.

+2

클론은 "얕은 복제"를 수행 할 가능성이 높습니다. "딥 클론"(즉, Invoice 객체 내의 모든 중첩 된 객체 복제)을 수행하기 위해 맞춤 magic'__clone' 메소드를 제공해야 할 수도 있습니다. –

+1

여기에 좋은 예가 있습니다 : http://php.net/manual/en/language .oop5.cloning.php – dMd

답변

1

좋은 생각은 설명서를 먼저 읽은 다음 나중에 묻습니다.

PHP manual에서

: 완벽하게 복제하는 속성이있는 객체의 복사본을 생성

는 항상 원하는 행동이 아니다. 복사 생성자가 필요한 좋은 예는 GTK 윈도우를 나타내는 객체가 있고 객체가이 GTK 윈도우의 리소스를 보유하고있는 경우입니다. 복제를 만들 때 동일한 속성으로 새 윈도우를 만들고 싶을 수 있습니다. 새 객체가 새 윈도우의 리소스를 보유하도록합니다. 또 다른 예는 개체가 사용하는 다른 개체에 대한 참조를 보유하고 있고이 개체의 새 인스턴스를 만들려는 부모 개체를 복제 할 때 복제본에 별도의 복사본이 있도록하는 경우입니다.

clone 키워드 (가능하면 개체의 __clone() 메서드를 호출 함)를 사용하여 개체 복사본이 만들어집니다. 객체의 __clone() 메소드는 직접 호출 할 수 없습니다. 개체가 복제되고

$copy_of_object = clone $object;

, PHP 5는 객체의 모든 속성의 단순 복사본을 수행합니다. 다른 변수에 대한 참조 인 모든 속성은 참조로 유지됩니다.

설명서에 PHP 5 동작이 설명되어 있지만 필자가 경험 한 바에 따르면 PHP 7도 동일한 방식으로 작동합니다.

내부의 다른 항목으로 복제해야하는 경우 __clone 메서드를 구현하고 개체를 정확히 복제하는 방법을 정의하십시오.