소개
단순 할당으로 객체의 복사본을 생성하면 메모리에 있는 객체에 대한 또 다른 참조가 생성됩니다. 따라서 속성의 변경 사항은 원본 객체와 복제 객체 모두에 반영됩니다. PHP에 복제가 있습니다. 개체의 얕은 복사본을 만드는 키워드입니다. 그러나 원본 개체의 속성 중 하나로 다른 포함된 개체가 있는 경우 복사된 개체는 여전히 동일한 개체를 참조합니다. 객체의 eep 사본을 생성하려면 마법의 메소드 __clone() 클래스에서 정의해야 함/
과제별 복사
다음 코드에서 myclass는 주소 클래스의 객체로 속성 중 하나를 가지고 있습니다. myclass의 객체는 할당에 의해 복제됩니다. 속성 값의 변경은 두 개체에 모두 반영됩니다.
예시
<?php
class address{
var $city="Nanded";
var $pin="431601";
function setaddr($arg1, $arg2){
$this->city=$arg1;
$this->pin=$arg2;
}
}
class myclass{
var $name="Raja";
var $obj;
function setname($arg){
$this->name=$arg;
}
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object\n";
print_r($obj1);
$obj2=$obj1;
$obj1->setname("Ravi");
echo "after change:\n";
print_r($obj1);
print_r($obj2);
?> 출력
이 코드는 다음 출력을 보여줍니다.
original object myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) after change: original object myclass Object( [name] => Ravi [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) copied object myclass Object( [name] => Ravi [obj] => address Object( [city] => Nanded [pin] => 431601 ) )
클론 키워드 사용
복제 키워드는 얕은 사본을 만듭니다. 속성 값의 변경은 복제된 개체에 반영되지 않습니다. 단, 포함된 개체를 수정하면 원본 및 복제된 개체에 변경 사항이 반영됩니다.
예시
<?php
class address{
var $city="Nanded";
var $pin="431601";
function setaddr($arg1, $arg2){
$this->city=$arg1;
$this->pin=$arg2;
}
}
class myclass{
var $name="Raja";
var $obj;
function setname($arg){
$this->name=$arg;
}
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?> 출력
출력은 다음 결과를 보여줍니다.
original object: myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) after change: original object: myclass Object( [name] => Ravi [obj] => address Object( [city] => Mumbai [pin] => 400001 ) ) cloned object: myclass Object( [name] => Raja [obj] => address Object( [city] => Mumbai [pin] => 400001 ) )
__clone() 메서드 사용
__clone() 메서드는 포함된 개체를 하나만 생성하여 깊은 복사본을 만듭니다.
예시
<?php
class address{
var $city="Nanded";
var $pin="431601";
function setaddr($arg1, $arg2){
$this->city=$arg1;
$this->pin=$arg2;
}
}
class myclass{
var $name="Raja";
var $obj;
function setname($arg){
$this->name=$arg;
}
public function __clone() {
$this->obj = clone $this->obj ;
}
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?> 출력
출력은 다음 결과를 보여줍니다.
original object: myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) ) after change: original object: myclass Object( [name] => Ravi [obj] => address Object( [city] => Mumbai [pin] => 400001 ) ) cloned object: myclass Object( [name] => Raja [obj] => address Object( [city] => Nanded [pin] => 431601 ) )