
__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