소개
단순 할당으로 객체의 복사본을 생성하면 메모리에 있는 객체에 대한 또 다른 참조가 생성됩니다. 따라서 속성의 변경 사항은 원본 객체와 복제 객체 모두에 반영됩니다. PHP에 복제가 있습니다. 개체의 얕은 복사본을 만드는 키워드입니다. 그러나 원본 개체의 속성 중 하나로 다른 포함된 개체가 있는 경우 복사된 개체는 여전히 동일한 개체를 참조합니다. 객체의 eep 사본을 생성하려면 마법의 메소드 __clone() 클래스에서 정의해야 함/
과제별 복사
다음 코드에서 myclass는 주소 클래스의 객체로 속성 중 하나를 가지고 있습니다. myclass의 객체는 할당에 의해 복제됩니다. 속성 값의 변경은 두 개체에 모두 반영됩니다.
예시
<?php class address{ var $city="Nanded"; var $pin="431601"; function setaddr($arg1, $arg2){ $this->city=$arg1; $this->pin=$arg2; } } class myclass{ var $name="Raja"; var $obj; function setname($arg){ $this->name=$arg; } } $obj1=new myclass(); $obj1->obj=new address(); echo "original object\n"; print_r($obj1); $obj2=$obj1; $obj1->setname("Ravi"); echo "after change:\n"; print_r($obj1); print_r($obj2); ?>
출력
이 코드는 다음 출력을 보여줍니다.
original object myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) after change: original object myclass Object( [name] => Ravi [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) copied object myclass Object( [name] => Ravi [obj] => address Object( [city] => Nanded [pin] => 431601 ) )
클론 키워드 사용
복제 키워드는 얕은 사본을 만듭니다. 속성 값의 변경은 복제된 개체에 반영되지 않습니다. 단, 포함된 개체를 수정하면 원본 및 복제된 개체에 변경 사항이 반영됩니다.
예시
<?php class address{ var $city="Nanded"; var $pin="431601"; function setaddr($arg1, $arg2){ $this->city=$arg1; $this->pin=$arg2; } } class myclass{ var $name="Raja"; var $obj; function setname($arg){ $this->name=$arg; } } $obj1=new myclass(); $obj1->obj=new address(); echo "original object:\n"; print_r($obj1); $obj2=clone $obj1; $obj1->setname("Ravi"); $obj1->obj->setaddr("Mumbai", "400001"); echo "after change:\n"; echo "original object:\n"; print_r($obj1); echo "cloned object:\n"; print_r($obj2); ?>
출력
출력은 다음 결과를 보여줍니다.
original object: myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) after change: original object: myclass Object( [name] => Ravi [obj] => address Object( [city] => Mumbai [pin] => 400001 ) ) cloned object: myclass Object( [name] => Raja [obj] => address Object( [city] => Mumbai [pin] => 400001 ) )
__clone() 메서드 사용
__clone() 메서드는 포함된 개체를 하나만 생성하여 깊은 복사본을 만듭니다.
예시
<?php class address{ var $city="Nanded"; var $pin="431601"; function setaddr($arg1, $arg2){ $this->city=$arg1; $this->pin=$arg2; } } class myclass{ var $name="Raja"; var $obj; function setname($arg){ $this->name=$arg; } public function __clone() { $this->obj = clone $this->obj ; } } $obj1=new myclass(); $obj1->obj=new address(); echo "original object:\n"; print_r($obj1); $obj2=clone $obj1; $obj1->setname("Ravi"); $obj1->obj->setaddr("Mumbai", "400001"); echo "after change:\n"; echo "original object:\n"; print_r($obj1); echo "cloned object:\n"; print_r($obj2); ?>
출력
출력은 다음 결과를 보여줍니다.
original object: myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) after change: original object: myclass Object( [name] => Ravi [obj] => address Object( [city] => Mumbai [pin] => 400001 ) ) cloned object: myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) )