update : 2015.11.03
php.shukuma.com

검색:
 
 
객체 복제

객체 복제

객체를 복사할때 프로퍼티까지 전부 복제하는것이 어떤경우에는 기대하는 동작이 아닐수 있습니다. 복사 생성자가 필요한 좋은 예를 들어보면, GTK 윈도를 나타내는 객체가 있고, 그 객체가 GTK 윈도의 리소스를 가지고 있는경우 복사를 할때 동일한 프로퍼티를 가지는 윈도우를 만들고 새 객체가 새 윈도우의 리소스를 보유하도록 하고 싶을수도 있습니다. 다른 예로 객체가 다른 객체의 참조를 가질경우, 부모 객체를 복제 할때 복제본이 독립적일수 있도록 해당 객체의 인스턴스를 새롭게 만들고 싶은 경우가 있습니다.

객체의 복사는 clone 키워드를 사용해서 할 수 있습니다(이 키워드는 객체의 __clone() 가 존재하는경우 해당 메서드를 호출합니다.) 객체의 __clone() 메서는 직접 호출 할 수 없습니다.

$copy_of_object = clone $object;

객체가 복제할때, PHP 5 는 객체의 프로퍼티들에 대해서 얕은 복사를 행합니다. 어떤 프로퍼티이든 다른 변수에대한 참조이며, 또한 참조로 유지 됩니다.

void __clone ( void )

복제가 완료된후, __clone() 메서드가 정의되어 있으면, 새로 생성된 오브젝트의 __clone() 메서드가 호출될것이며, 이때 필요할 경우 프로퍼티에 대한 변경을 행할 수 있습니다.

Example #1 Cloning an object

<?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);

?>

위 예제의 출력:

Original Object:
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
        )

)