PHP 오브젝트의 클론 생성
PHP/매뉴얼 번역 2008/06/20 00:42오브젝트를 복사할때 프로퍼티도 전부다 이중화한다고 항상 원하는 동작을 한다고 장담할 수 없다.
복사컨스트럭터를 필요로하는 예로서 GTK윈도우를 나타내는 오브젝트를 가지고 있고 그 오브젝트가 GTK 윈도우의 리소스를 가지고 있을때 복사를 작성할때에 똑같은 프로퍼티를 가지고 있는 윈도우를 작성하여 새로운 오브젝트가 새로운 윈도우의 리소스를 가지도록 하는 경우가 있을 수 있다.
다른 예로서는 오브젝트가 , 해당 오브젝트가 사용하는 다른 오브젝트에의 레퍼런스를 가지고 있고 , 부모 오브젝트를 복사할때 복사가 독립된 오브젝트의 복사본을 가지고있도록 그 오브젝트의 인스턴스를 새롭게 작성하려하는 경우가 있을 수 있다.
오브젝트의 복사는 clone 키워드 (해당 오브젝트의 __clone() 메소드가 있는 경우에 이것을 호출한다.) 로 작성된다. 오브젝트의 __clone() 메소드를 직접 호출하는것은 불가능하다.
$copy_of_object = clone $object;오브젝트의 클론이 작성될때 PHP 5 는 해당 오브젝트의 프로퍼티를 전부 shallow copy 한다. 다른 변수에의 레퍼런스를 가지고 있는 모든 프러퍼티는 레퍼런스 상태를 유지한다. __clone() 메소드가 정의되어 있는 경우 신규작성된 오브젝트의 __clone() 메소드가 호출되기 때문에 이 내부에서 프로퍼티의 필요한 변경을 행할 수 있다.
오브젝트 클론 생성 예.
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// Force a copy of this->object, otherwise
// it will point to same object.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?> 결과
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)
원문링크:http://www.php.net/manual/en/language.oop5.cloning.php
목차에
PHP 클래스와 오브젝트 ( Classes and Objects ) PHP 5
'PHP > 매뉴얼 번역' 카테고리의 다른 글
| PHP 세션 (0) | 2008/06/25 |
|---|---|
| PHP 문자열 지정방법 ( Heredoc ) (0) | 2008/06/20 |
| PHP Late Static Bindings (0) | 2008/06/20 |
| PHP 타이프 힌팅 (0) | 2008/06/20 |
| PHP 오브젝트의 비교 (0) | 2008/06/20 |
| PHP 오브젝트의 클론 생성 (0) | 2008/06/20 |
| PHP final 키워드 (0) | 2008/06/20 |
| PHP 매직메소스 (0) | 2008/06/20 |
| PHP 패턴 (0) | 2008/06/20 |
| PHP 오브젝트 이터레이션 (0) | 2008/06/20 |
| PHP 오버로드 (0) | 2008/06/20 |