Computer >> 컴퓨터 >  >> 프로그램 작성 >> PHP

PHP 객체 복제

<시간/>

소개

단순 할당으로 객체의 복사본을 생성하면 메모리에 있는 객체에 대한 또 다른 참조가 생성됩니다. 따라서 속성의 변경 사항은 원본 객체와 복제 객체 모두에 반영됩니다. 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
   )

)