php 객체 복사는 객체의 참조 주소를 복사하는 것이므로 $objA = $objB를 사용할 때 $objA와 $objB는 동일한 메모리 주소를 가리킵니다. $objA가 변경되면 $objB도 영향을 받습니다.
$objA 개체를 $objB 개체에 복사하려는 경우 복사 후 $objA에 대한 변경 사항은 $objB에 영향을 미치지 않습니다. 즉, $objA와 $objB는 두 개의 독립적인 개체이지만 $objB의 초기 값은 $objA에 의해 생성됩니다. 보다 효율적인 방법은 clone() 메서드를 사용하는 것입니다.
$objB = clone $objA;
$objB의 값은 $objA 인스턴스 객체의 clone() 메소드에 의해 변경된 인스턴스입니다.
객체가 복사되면 모든 속성의 참조는 변경되지 않고 원래 변수를 가리킵니다. __clone() 메서드가 정의되면 새로 생성된 객체의 __clone() 메서드가 호출되어 사용할 수 있습니다. . 속성 값을 수정합니다.
예 1: 객체 복제
<?php class subclass{ private $name; private $age; public function __construct(){ $this->name = 'fdipzone'; $this->age = '30'; } public function __clone(){ $this->name = 'xfdipzone'; $this->age = '29'; } } class myclass{ public $p1; public $p2; public function __construct(){ } public function __clone(){ $this->p1 = clone $this->p1; } } $obj = new myclass(); $obj->p1 = new subclass(); $obj->p2 = new subclass(); $obj2 = clone $obj; echo '<pre class="brush:php;toolbar:false">'; echo 'obj<br>'; var_dump($obj); echo '<br>obj2<br>'; var_dump($obj2); echo 'ok'; echo ''; ?>
위의 예는 다음과 같이 출력됩니다.
obj object(myclass)#1 (2) { ["p1"]=> object(subclass)#2 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } ["p2"]=> object(subclass)#3 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } } obj2 object(myclass)#4 (2) { ["p1"]=> object(subclass)#5 (2) { ["name":"subclass":private]=> string(9) "xfdipzone" ["age":"subclass":private]=> string(2) "29" } ["p2"]=> object(subclass)#3 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } }
보시다시피, $obj2 clone $obj, $obj->p1 clone $obj-> p1, __clone() 메서드가 실행됩니다. __clone 메서드에서는 p1의 name 및 age 속성이 수정되므로 p1의 이름과 age가 변경됩니다. p2는 clone() 메소드를 실행하지 않았으므로 새로 복사된 $obj2->p2의 속성은 $obj->p2와 동일합니다.
예 2: 객체를 복제하지만 일부 속성 참조는 변경되지 않은 상태로 유지됩니다.
<?php class myclass{ public $num = null; public $msg = null; public function __construct(){ $this->num = & $this->num; $this->msg = 'OK'; } public function __clone(){ $this->num = 2; } } $obj = new myclass(); $obj->num = 1; echo 'print obj values<br>'; var_dump($obj); echo '<br><br>'; $obj2 = clone $obj; echo 'clone obj to obj2<br>'; echo 'obj->num:'.$obj->num.'<br>'; echo 'obj->msg:'.$obj->msg.'<br>'; echo 'obj2->num:'.$obj2->num.'<br>'; echo 'obj2->msg:'.$obj2->msg.'<br><br>'; $obj2->num = 3; $obj2->msg = 'Yes'; echo 'set obj2->num=3, obj2->msg=Yes<br>'; echo 'obj->num:'.$obj->num.'<br>'; echo 'obj->msg:'.$obj->msg.'<br>'; echo 'obj2->num:'.$obj2->num.'<br>'; echo 'obj2->msg:'.$obj2->msg.'<br><br>'; ?>
위의 예는 다음과 같이 출력됩니다:
print obj values object(myclass)#1 (2) { ["num"]=> &int(1) ["msg"]=> string(2) "OK" } clone obj to obj2 obj->num:2 obj->msg:OK obj2->num:2 obj2->msg:OK set obj2->num=3, obj2->msg=Yes obj->num:3 obj->msg:OK obj2->num:3 obj2->msg:Yes
$this->num = &$this->num이므로 clone() 이후에는 새로운 항목의 $this->num object are 이전 개체를 참조하는 메모리 주소입니다. 따라서 이전 개체의 속성이 변경되면 새 개체의 속성도 변경되므로 일부 속성에 대한 참조는 변경되지 않은 상태로 유지됩니다.
그리고 $this->msg는 주소 참조가 아니므로 새 개체의 msg가 변경되더라도 이전 개체에는 영향을 미치지 않습니다.
참고: $this->num = & $this->num 객체 속성 주소 참조를 사용하는 경우 복제하기 전에 이 속성을 에코/인쇄할 수 없습니다. 그렇지 않으면 주소 참조가 유효하지 않게 됩니다.
위의 예에서 echo $obj->num; 앞에 $obj2 = clone $obj를 추가하면 주소 참조가 유효해집니다. 즉, $obj2->num이 변경됩니다. $obj ->num은 변경되지 않습니다.
이 글에서는 PHP 객체 복제 관련 내용을 소개합니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 참고해주세요.
관련 권장 사항:
위 내용은 PHP 객체 복제에 대해 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!