Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 객체 복사본을 만드는 방법: clone 키워드 완벽 가이드

PHP에서 객체의 복사본을 만들려면 clone 키워드를 사용합니다. 객체를 단순히 다른 변수에 할당하면 두 변수가 같은 객체를 참조하게 되지만, clone을 사용하면 완전히 독립된 새로운 객체 인스턴스가 생성됩니다. 아래 예제를 통해 그 차이를 확인해 보겠습니다.

기본 예제

<?php
    class Demo {
        public $val1;
        public $val2;
    }
    $ob = new Demo();
    $copyOb = clone $ob;
    $ob->val1 = "Jack";
    $ob->val2 = "Kevin";
    $copyOb->val1 = "Tom";
    $copyOb->val2 = "Ryan";
    echo "$ob->val1$ob->val2\n";
    echo "$copyOb->val1$copyOb->val2\n";
?>

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

JackKevin
TomRyan

원본 객체와 복사본 객체는 서로 독립적으로 존재하기 때문에, 한쪽의 속성 값을 변경하더라도 다른 쪽에는 아무런 영향을 주지 않습니다.

생성자가 있는 클래스의 객체 복사 예제

이번에는 생성자(__construct)를 포함한 클래스에서 clone 키워드로 객체를 복사하는 방법을 살펴보겠습니다.

<?php
    class Demo {
        public $deptname;
        public $deptzone;
        public function __construct($a, $b) {
            $this->deptname = $a;
            $this->deptzone = $b;
        }
    }
    $val = new Demo('Finance', 'West');
    $copy = clone $val;
    print_r($val);
    print_r($copy);
?>

출력 결과

Demo Object(
    [deptname] => Finance
    [deptzone] => West
)
Demo Object(
    [deptname] => Finance
    [deptzone] => West
)

생성자를 통해 초기화된 객체도 clone 키워드를 사용하면 동일한 구조와 값을 가진 복사본이 정상적으로 생성됩니다.

알아두면 좋은 점

clone으로 객체를 복사할 때 클래스에 __clone() 매직 메서드가 정의되어 있으면, 복사 작업이 완료된 직후 해당 메서드가 자동으로 호출됩니다. 이를 활용하면 복사 시점에 특정 속성을 재설정하거나 추가 로직을 수행할 수 있습니다.

또한 PHP의 clone은 기본적으로 얕은 복사(shallow copy) 방식으로 동작합니다. 즉, 객체 내부에 중첩된 다른 객체들은 참조만 복사됩니다. 내부 객체까지 완전히 복사하는 깊은 복사(deep copy)가 필요하다면 __clone() 메서드 안에서 중첩 객체를 직접 복제하는 코드를 작성해야 합니다.