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 중국어 웹사이트의 기타 관련 기사를 참조하세요!