PHP의 얕은 복사와 깊은 복사에 대한 자세한 설명

黄舟
풀어 주다: 2023-03-16 20:12:02
원래의
1540명이 탐색했습니다.

PHP의 얕은 복사와 깊은 복사의 자세한 예

서문:

최근에 디자인 패턴에 대한 지식을 검토하면서 프로토타입 패턴 디자인 패턴을 봤을 때 다음과 같은 질문이 있다는 것을 깨달았습니다. 얕은 복사와 깊은 복사. 여기에 요약하고 앞으로 더 많은 관심을 기울여야 함을 상기시켜 드리겠습니다.

PHP5부터 newoperator는 자동으로 참조를 반환합니다. 개체 변수는 더 이상 전체 개체의 값을 저장하지 않고 실제 개체 콘텐츠에 액세스하기 위한 식별자만 저장합니다. 객체가 매개변수로 전달되거나 결과로 반환되거나 다른 변수에 할당되면 다른 변수는 원래 변수와 참조 관계가 없지만 둘 다 동일한 식별자의 복사본을 저장합니다. 같은 개체.

예시:

class Example1
{
  public $name;

  public function construct($name)
  {
    $this->name = $name;
  }
}

$ex1 = new Example('test1');// $ex1->name现在是:test1
$ex2 = $ex1;// $ex2->name现在是:test1

$ex2->name = 'test2';// 这样修改一下之后,$ex1->name与$ex2->name都变为了:test2
로그인 후 복사

위의 예를 통해 객체 간 참조의 개념을 이해할 수 있으므로 계속해서 PHP에서 clone 키워드를 제공하여 객체 복사를 수행하거나 위 클래스에서 설명합니다:

$ex1 = new Example('test1');// $ex1->name现在是:test1
$ex2 = clone $ex1;//$ex2->name现在是:test1

$ex2->name = 'test2';//现在$ex1->name还是test1,而$ex2->name是test2
로그인 후 복사

여기에서 볼 수 있듯이 복제 후 $ex1과 $ex2는 서로 다른 두 개체이며 고유한 변수 환경을 갖습니다. 그러나 여기서는 이 두 객체 내부에 값 유형 데이터가 있다는 점에 유의해야 합니다. 내부적으로 참조 유형이 있는 경우 복제를 통해 얻은 새 객체의 참조는 여전히 원래 참조를 가리킵니다. 얕은 복사와 깊은 복사의 개념은 다음과 같습니다.

얕은 복사: 복제를 사용하여 객체를 복사하는 것을 "얕은 복사"라고 합니다. object. , 다른 개체에 대한 모든 참조는 여전히 원래 개체를 가리킵니다.

Deep copy: 복사된 개체의 모든 변수는 다른 개체를 참조하는 변수를 제외하고 원본 개체와 동일한 값을 포함합니다.

clone의 기본 용도는 얕은 복사를 수행하는 것인데, 깊은 복사를 수행하려면 어떻게 해야 할까요?

방법 1: 복제 방법 사용

public function clone()
{
  $this->obj = new Obj();
}
로그인 후 복사

이 방법은 매우 직관적이지만 매우 번거로운 작업 방법이 있습니다. 즉, 클래스에 여러 참조가 포함된 경우 클래스에서 하나씩 재설정해야 합니다. 클론 방법 . 그리고 우리는 몇 가지 주기적참조 문제도 처리해야 합니다. 매우 복잡합니다.

방법 2: 직렬화 사용(냉장 및 해동)

$tmp = serialize($ex1);
$ex2 = unserialize($tmp);
로그인 후 복사

이때 얻은 $ex2는 완전히 새로운 객체입니다. 이 프로세스를 Java에서는 "냉장" 및 "해동" 프로세스라고도 합니다.

직렬화는 재귀적 프로세스입니다. 객체 내에서 참조되는 객체 수와 객체의 레이어 수를 완전히 복사할 수 있습니다. 2번 방법은 정말 음란하고 폭력적이지만 너무 마음에 듭니다.

위 내용은 PHP의 얕은 복사와 깊은 복사에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿