객체 복제

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

객체 복사본은 (가능한 경우 객체의 __clone() 메서드를 호출하는) clone 키워드를 사용하여 생성됩니다.

$copy_of_object = clone $object;
                

객체가 복제되면 PHP는 객체의 모든 속성에 대한 얕은 복사를 수행합니다. 다른 변수에 대한 참조인 모든 속성은 참조로 남습니다.

__clone(): void

복제가 완료되면 __clone() 메서드가 정의되면 새로 생성된 객체의 __clone() 메서드가 호출되어 필요한 속성을 변경할 수 있습니다.

예제 #1 객체 복제

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

)
                

단일 표현식에서 새로 복제된 개체의 구성원에 액세스할 수 있습니다.

예제 #2 새로 복제된 개체의 액세스 구성원

                  
<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>
                  
                

위의 예는 다음을 출력합니다.

2016