PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPオブジェクトのクローン作成


はじめに

単純な割り当てでオブジェクトのコピーを作成すると、メモリ内のオブジェクトへの別の参照が作成されるだけです。したがって、属性の変更は、元のオブジェクトと複製されたオブジェクトの両方に反映されます。 PHPにはクローンがあります オブジェクトの浅いコピーを作成するキーワード。ただし、元のオブジェクトのプロパティの1つとして他の埋め込みオブジェクトがある場合でも、コピーされたオブジェクトは同じものを参照します。オブジェクトの深いコピーを作成するには、マジックメソッド __ clone() クラスで定義する必要があります/

割り当てによるコピー

次のコードでは、myclassはアドレスクラスのオブジェクトとして属性の1つを持っています。 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
   )

)

  1. PHPのget_class()関数

    get_class()関数は、オブジェクトのクラスの名前を取得します。オブジェクトがオブジェクトでない場合はFALSEを返します。クラス内でオブジェクトが除外されると、そのクラスの名前が返されます。 構文 get_class(object) パラメータ オブジェクト −テストされたオブジェクト。キャス内でこのパラメーターを回避できます。 戻る get_class()関数は、オブジェクトのクラスの名前を返します。オブジェクトがオブジェクトでない場合はFALSEを返します。クラス内でオブジェクトが除外されると、そのクラスの名前が返されます。 例 以下は例です- <?php cl

  2. PHPのget_object_vars()関数

    get_object_var()関数は、指定されたオブジェクトのプロパティを取得します。指定されたオブジェクトに対して定義されたオブジェクトプロパティの連想配列を返します。 構文 get_object_vars(object) パラメータ オブジェクト −オブジェクトインスタンス。 戻る get_object_var()関数は、指定されたオブジェクトに対して定義されたオブジェクトプロパティの連想配列を返します。プロパティに値が割り当てられていない場合は、NULL値で返されます。 例 以下は例です- <?php    class Point2D { &nb