>  기사  >  백엔드 개발  >  PHP 객체 복제에 대해 알아보기

PHP 객체 복제에 대해 알아보기

jacklove
jacklove원래의
2018-06-09 14:42:331642검색

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 = &#39;fdipzone&#39;;
		$this->age = &#39;30&#39;;
	}
	public function __clone(){
		$this->name = &#39;xfdipzone&#39;;
		$this->age = &#39;29&#39;;
	}
}
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 &#39;<pre class="brush:php;toolbar:false">&#39;;
echo &#39;obj<br>&#39;;
var_dump($obj);
echo &#39;<br>obj2<br>&#39;;
var_dump($obj2);
echo &#39;ok&#39;;
echo &#39;
'; ?>

위의 예는 다음과 같이 출력됩니다.

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 = &#39;OK&#39;;
	}
	public function __clone(){
		$this->num = 2;	
	}
}
$obj = new myclass();
$obj->num = 1;
echo &#39;print obj values<br>&#39;;
var_dump($obj);
echo &#39;<br><br>&#39;;
$obj2 = clone $obj;
echo &#39;clone obj to obj2<br>&#39;;
echo &#39;obj->num:&#39;.$obj->num.&#39;<br>&#39;;
echo &#39;obj->msg:&#39;.$obj->msg.&#39;<br>&#39;;
echo &#39;obj2->num:&#39;.$obj2->num.&#39;<br>&#39;;
echo &#39;obj2->msg:&#39;.$obj2->msg.&#39;<br><br>&#39;;
$obj2->num = 3;
$obj2->msg = &#39;Yes&#39;;
echo &#39;set obj2->num=3, obj2->msg=Yes<br>&#39;;
echo &#39;obj->num:&#39;.$obj->num.&#39;<br>&#39;;
echo &#39;obj->msg:&#39;.$obj->msg.&#39;<br>&#39;;
echo &#39;obj2->num:&#39;.$obj2->num.&#39;<br>&#39;;
echo &#39;obj2->msg:&#39;.$obj2->msg.&#39;<br><br>&#39;;
?>

위의 예는 다음과 같이 출력됩니다:

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 중국어 홈페이지를 참고해주세요.

관련 권장 사항:

mysql 일반 로그 관련 작업 정보

php 쿠키 작업 클래스 소개

php 비밀번호 생성 클래스 소개

위 내용은 PHP 객체 복제에 대해 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.