목차
PHP에서 전체 복사와 얕은 복사의 차이점은 무엇인가요? 복사: 할당하면 값이 완전히 복사됩니다. 전체 복사본 중 하나를 변경해도 다른 복사본에는 영향이 없습니다. 할당 시 참조 할당은 별칭을 사용하는 것과 같습니다. 둘 중 하나를 수정하면 다른 하나에도 영향을 미칩니다.
백엔드 개발 PHP 문제 PHP에서 깊은 복사와 얕은 복사의 차이점은 무엇입니까?

PHP에서 깊은 복사와 얕은 복사의 차이점은 무엇입니까?

Feb 10, 2022 am 09:53 AM
php

PHP에서 깊은 복사와 얕은 복사의 차이점: 1. 깊은 복사는 값을 할당할 때 완전한 복사본인 반면 얕은 복사는 별칭을 사용하는 것과 동일한 참조 할당일 뿐입니다. 2. 깊은 복사가 값을 변경하는 경우; 그 중 하나는 다른 하나에 영향을 미치지 않으며 하나에 대한 얕은 복사 수정은 다른 하나에도 영향을 미칩니다.

PHP에서 깊은 복사와 얕은 복사의 차이점은 무엇입니까?

본 튜토리얼의 운영 환경: Windows 10 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP에서 전체 복사와 얕은 복사의 차이점은 무엇인가요? 복사: 할당하면 값이 완전히 복사됩니다. 전체 복사본 중 하나를 변경해도 다른 복사본에는 영향이 없습니다. 할당 시 참조 할당은 별칭을 사용하는 것과 같습니다. 둘 중 하나를 수정하면 다른 하나에도 영향을 미칩니다.

PHP에서 =가 할당되면 일반 개체는 깊은 복사본이지만 개체의 경우 얕은 복사본입니다. 즉, 객체 할당은 참조 할당입니다. (객체가 매개변수로 전달되면 함수 정의 시 매개변수 앞에 앰퍼샌드가 있는지 여부에 관계없이 참조로도 전달됩니다.)

php4에서 객체의 = 할당은 복사, 많은 문제가 있습니다. 우리는 무의식적으로 많은 복사본을 만들 수 있습니다.

PHP5에서는 객체의 할당과 전송이 모두 참조입니다. 복사본을 구현하기 위해 PHP는 복제 기능 구현을 제공합니다.

Clone은 완전한 복사본을 만듭니다. 그러나 복제할 때 소스 객체의 모든 내용을 복사하고 싶지 않을 경우 __clone을 사용하여 작업할 수 있습니다.

__clone()에서는 몇 가지 작업을 수행할 수 있습니다. 이러한 작업, 즉 __clone 함수는 복사된 복사본 개체에 대해 작동합니다

<?php
//普通对象赋值,深拷贝,完全值复制
$m = 1;
$n = $m;
$n = 2;
echo $m;//值复制,对新对象的改变不会对m作出改变,输出 1.深拷贝
echo PHP_EOL;
/*==================*/
 
//对象赋值,浅拷贝,引用赋值
class Test{
    public $a=1;
}
$m = new Test();
$n = $m;//引用赋值
$m->a = 2;//修改m,n也随之改变
echo $n->a;//输出2,浅拷贝
echo PHP_EOL;
?>
로그인 후 복사

할당 중에 개체가 참조되므로 값 복사를 달성하기 위해 PHP는 개체를 복사하는 복제 함수를 제공합니다.

그런데 복제 기능에 문제가 있습니다. 객체를 복제하면 원본 객체의 일반 속성을 값으로 복사할 수 있지만 원본 객체의 객체 속성을 할당하면 여전히 참조 할당이고 얕습니다. 사본.

<?php
class Test{
    public $a=1;
}
 
class TestOne{
    public $b=1;
    public $obj;
    //包含了一个对象属性,clone时,它会是浅拷贝
    public function __construct(){
        $this->obj = new Test();
    }
}
$m = new TestOne();
$n = $m;//这是完全的浅拷贝,无论普通属性还是对象属性
 
$p = clone $m;
 
//普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
$p->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
 
//对象属性是浅拷贝,改变对象属性中的a,源对象m中的对象属性中a也改变
 
$p->obj->a = 3;
echo $m->obj->a;//输出3,随新对象改变
?>
로그인 후 복사

 객체의 진정한 전체 복사본을 얻으려면 두 가지 방법이 있습니다:

clone 함수 작성: 다음과 같이

<?php
class Test{
    public $a=1;
}
 
class TestOne{
    public $b=1;
    public $obj;
    //包含了一个对象属性,clone时,它会是浅拷贝
    public function __construct(){
        $this->obj = new Test();
    }
     
    //方法一:重写clone函数
    public function __clone(){
        $this->obj = clone $this->obj;
    }
}
 
$m = new TestOne();
$n = clone $m;
 
$n->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
 
//由于改写了clone函数,现在对象属性也实现了真正的深拷贝,对新对象的改变,不会影响源对象
$n->obj->a = 3;
echo $m->obj->a;//输出1,不随新对象改变,还是保持了原来的属性
 
?>
로그인 후 복사

 __clone() 함수를 다시 작성하는 것은 편리하지 않으며 이 클래스를 각 클래스의 객체 속성은 모두 __clone()

에서 하나씩 복제됩니다. 두 번째 방법은 직렬화 및 역직렬화로 구현됩니다. 이 방법은 객체의 전체 복사본을 구현하는 것이 간단하며 클래스를 수정할 필요가 없습니다

<?php
class Test{
    public $a=1;
}
 
class TestOne{
    public $b=1;
    public $obj;
    //包含了一个对象属性,clone时,它会是浅拷贝
    public function __construct(){
        $this->obj = new Test();
    }
     
}
 
$m = new TestOne();
//方法二,序列化反序列化实现对象深拷贝
$n = serialize($m);
$n = unserialize($n);
 
$n->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
 
 
$n->obj->a = 3;
echo $m->obj->a;//输出1,不随新对象改变,还是保持了原来的属性,可以看到,序列化和反序列化可以实现对象的深拷贝
 
?>
로그인 후 복사

세 번째 방법도 있습니다. 이 방법은 실제로 두 번째 방법과 유사합니다. json_encode 이후에는 json_decode를 사용하여 할당을 구현합니다. 권장 학습: "

PHP Video Tutorial

"

위 내용은 PHP에서 깊은 복사와 얕은 복사의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 라우팅 CakePHP 라우팅 Sep 10, 2024 pm 05:25 PM

이번 장에서는 라우팅과 관련된 다음과 같은 주제를 학습하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

See all articles