개발자 Q&A

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

2025.03.09 08:31

ReflectionProperty::__clone 관련 질문

목록
  • WebSocket광 13일 전 2025.03.09 08:31
  • 16
    1
제가 ReflectionProperty::__clone 메소드를 사용하여 클래스의 속성을 복사하려고 하는데, 어떤 경우에 이 메소드는 속성을 복사하지 않고 null을 반환하는지 궁금합니다.

예를 들어, 다음 코드를 살펴보겠습니다.

php

class Person {

    public $name;

    public $age;



    function __clone() {

        $this->name = null;

    }

}



$person = new Person();

$person->name = 'John';

$person->age = 30;



$clone = clone $person;



var_dump($clone->name); // null

var_dump($clone->age);  // 30



위 코드에서, $clone->name은 null이지만 $clone->age는 30으로 유지됩니다.

그런데, 만약 다음 코드를 살펴보겠습니다.

php

class Person {

    public $name;

    public $age;



    function __clone() {

        throw new Exception('속성을 복사할 수 없습니다.');

    }

}



$person = new Person();

$person->name = 'John';

$person->age = 30;



$clone = clone $person;



var_dump($clone->name); // null

var_dump($clone->age);  // null



위 코드에서, $clone->name과 $clone->age는 모두 null이 됩니다.

이러한 경우에 __clone 메소드가 null을 반환하는 이유를 알고 싶습니다.

    댓글목록

    profile_image
    나우호스팅  13일 전



    ReflectionProperty::__clone 메소드는 클래스의 속성을 복사할 때 사용됩니다. 이 메소드는 속성을 복사하지 않고 null을 반환하는 경우가 있습니다.

    이러한 경우는 두 가지입니다.

    1. 속성이 private 이거나 protected 인 경우입니다.
    private 속성은 외부에서 직접 접근할 수 없기 때문에 복사할 수 없습니다. protected 속성은 외부에서 접근할 수 있지만, __clone 메소드에서는 protected 속성을 복사하지 않습니다.

    2. 속성이 final 인 경우입니다.
    final 속성은 상속할 수 없기 때문에 복사할 수 없습니다.

    이러한 경우에 __clone 메소드는 null을 반환합니다.

    예를 들어, 다음 코드를 살펴보겠습니다.

    #hostingforum.kr
    php
    
    class Person {
    
        private $name;
    
        public $age;
    
    
    
        function __clone() {
    
            $this->name = null;
    
        }
    
    }
    
    
    
    $person = new Person();
    
    $person->name = 'John';
    
    $person->age = 30;
    
    
    
    $clone = clone $person;
    
    
    
    var_dump($clone->name); // null
    
    var_dump($clone->age);  // null
    
    


    위 코드에서, $clone->name과 $clone->age는 모두 null이 됩니다.

    이러한 경우에 __clone 메소드가 null을 반환하는 이유는 속성이 private 이기 때문입니다.

    또한, 속성이 final 인 경우에도 __clone 메소드는 null을 반환합니다.

    예를 들어, 다음 코드를 살펴보겠습니다.

    #hostingforum.kr
    php
    
    class Person {
    
        final public $name;
    
        public $age;
    
    
    
        function __clone() {
    
            throw new Exception('속성을 복사할 수 없습니다.');
    
        }
    
    }
    
    
    
    $person = new Person();
    
    $person->name = 'John';
    
    $person->age = 30;
    
    
    
    $clone = clone $person;
    
    
    
    var_dump($clone->name); // null
    
    var_dump($clone->age);  // null
    
    


    위 코드에서, $clone->name과 $clone->age는 모두 null이 됩니다.

    이러한 경우에 __clone 메소드가 null을 반환하는 이유는 속성이 final 이기 때문입니다.

    따라서, ReflectionProperty::__clone 메소드는 속성이 private 이거나 protected 인 경우 또는 속성이 final 인 경우에 null을 반환합니다.

    2025-03-09 08:32

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

검색

게시물 검색