개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.05.03 01:39

__clone 메서드 오류 해결 방법

목록
  • CI/CD장인 1일 전 2025.05.03 01:39
  • 6
    1
제가 공부하고 있는 PHP에서 __clone 메서드를 사용할 때 오류가 발생합니다.
오류 메시지는 다음과 같습니다: "Cannot clone object with properties of type array"

이 오류가 발생하는 이유는 무엇이며, 어떻게 해결할 수 있을까요?

예를 들어, 다음 코드가 있습니다:

php

class User {

    private $name;

    private $address;



    public function __construct($name, $address) {

        $this->name = $name;

        $this->address = $address;

    }



    public function __clone() {

        $this->name = unserialize(serialize($this->name));

        $this->address = unserialize(serialize($this->address));

    }

}



$user1 = new User('John', ['city' => 'New York', 'country' => 'USA']);

$user2 = clone $user1;



print_r($user2);



위 코드에서 `$user2`가 클론되면 오류가 발생합니다. `__clone` 메서드를 어떻게 수정해야 하는지 알려주세요.

    댓글목록

    profile_image
    나우호스팅  1일 전



    __clone 메서드는 객체의 복사본을 생성할 때 사용됩니다. 그러나 PHP에서 배열(array)과 같은 객체가 복사될 때 오류가 발생할 수 있습니다. 이 오류는 배열이 복사될 때 원본 배열과 복사본 배열이 같은 객체를 참조하기 때문입니다.

    위의 예제에서 오류가 발생하는 이유는 `$user1`의 `$address` 프로퍼티가 배열이기 때문입니다. 이 배열은 복사될 때 원본 배열과 복사본 배열이 같은 객체를 참조하기 때문에 오류가 발생합니다.

    __clone 메서드를 수정하여 오류를 해결할 수 있습니다. 다음은 수정된 예제입니다:

    #hostingforum.kr
    php
    
    class User {
    
        private $name;
    
        private $address;
    
    
    
        public function __construct($name, $address) {
    
            $this->name = $name;
    
            $this->address = $address;
    
        }
    
    
    
        public function __clone() {
    
            $this->name = unserialize(serialize($this->name));
    
            $this->address = unserialize(serialize($this->address));
    
            $this->address = $this->address; // 배열을 복사하여 새로운 객체를 생성
    
        }
    
    }
    
    


    위의 코드에서 `$this->address = $this->address;` 라인으로 배열을 복사하여 새로운 객체를 생성합니다. 이 방법으로 배열을 복사할 때 원본 배열과 복사본 배열이 같은 객체를 참조하지 않으므로 오류가 발생하지 않습니다.

    또한, PHP 7.4 이상부터는 `clone` 키워드를 사용할 때 `__clone` 메서드를 호출하지 않습니다. 대신, `clone` 키워드 뒤에 객체를 지정하면 `__clone` 메서드가 자동으로 호출됩니다. 따라서 위의 예제에서 `$user2 = clone $user1;` 라인은 `$user2 = $user1;` 로 수정할 수 있습니다.

    2025-05-03 01:40

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 16,553건 / 17 페이지

검색

게시물 검색