php__clone()のクローニング方法の詳細説明とシャロークローニングとディープクローニングの使用例

伊谢尔伦
リリース: 2023-03-14 09:12:02
オリジナル
2964 人が閲覧しました

オブジェクト クラスで clone() メソッドを定義して、オブジェクトのクローン作成 の動作 を調整できます。このメソッドのコードは、クローン作成操作中に実行されます。すべての既存のオブジェクト メンバーをターゲット オブジェクトにコピーすることに加えて、 clone() メソッドで指定された操作が実行されます。次に、Corporate_Drone クラスを変更し、次のメソッドを追加します。

function clone() { 
 $this->tiecolor = "blue";
}
ログイン後にコピー
その後、新しい Corporate_Drone オブジェクトを作成し、employeeid メンバーの値を増やし、オブジェクトのクローンを作成し、クローンのタイカラーを示すデータを出力します。オブジェクトには実際に clone() メソッド セットが渡されます。サンプルコード:

<?php
 // Create new corporatedrone object
  $drone1 = new corporatedrone();
 
 // Set the $drone1 employeeid member
  $drone1->setEmployeeID("12345");
 
 // Clone the $drone1 object
  $drone2 = clone $drone1;
 
 // Set the $drone2 employeeid member
  $drone2->setEmployeeID("67890");
 
 // Output the $drone1 and $drone2 employeeid members
  echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />";
  echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />";
  echo "drone2 tiecolor: ".$drone2->getTiecolor()."<br />";
?>
ログイン後にコピー

プログラムの実行結果

drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:
ログイン後にコピー

別の小さな例:

<?php
class Fruit {
 private $name = "水果";
 private $color = "颜色";
 
 public function setName($name){
 $this->name = $name;
 }
 
 public function setColor($color){
 $this->color = $color;
 }
 
 function showColor(){
 return $this->color.&#39;的&#39;.$this->name."<br />";
 }
 
 function destruct(){
 echo "被吃掉了(对象被回收) <br />"; 
 }
}

$apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();

$clone_apple = $apple;
$clone_apple->setName("小苹果");
$clone_apple->setColor("青色");

echo $clone_apple->showColor();
?>
ログイン後にコピー

上記は、あるクラスを別のクラスに割り当てているだけなので、この時点ではまだメモリ内にオブジェクトが存在します。

<?php
class Fruit {
 private $name = "水果";
 private $color = "颜色";
 
 public function setName($name){
 $this->name = $name;
 }
 
 public function setColor($color){
 $this->color = $color;
 }
 
 function showColor(){
 return $this->color.&#39;的&#39;.$this->name."<br />";
 }
 
 function destruct(){
 echo "被吃掉了(对象被回收) <br />"; 
 }
 function clone(){
 $this->name = "克隆水果"; 
 }
}

$apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();

$clone_apple = clone $apple;
$clone_apple->setColor("青色");

echo $clone_apple->showColor();
?>
ログイン後にコピー

clone メソッドは新しいクラスのクローンを作成するため、この時点でメモリには 2 つのオブジェクトがあります。

PHP の clone() メソッドは、オブジェクト インスタンスの浅いコピーを作成します。オブジェクト内の基本的な

数値型

は値によってコピーされ、clone メソッドがオーバーライドされていない場合、オブジェクト内のオブジェクト型メンバー変数は次のようになります。クローン オブジェクトのメンバー変数が使用されている場合、以下の例の 28 行目の コメント にあるように、メンバー変数は

Shallow clone: と書かれています。オブジェクトのクローンを作成します。非オブジェクトおよび非リソース データ、つまりオブジェクト ストアの属性がオブジェクト タイプの場合、不完全なクローン作成が発生します
<?php
class B{
 public $val = 10;
}
class A{
 public $val = 20;
 public $b;
 public function construct(){
  $this->b = new B();
 }
}
$obj_a = new A();
$obj_b = clone $obj_a;
$obj_a->val = 30;
$obj_a->b->val = 40;
var_dump($obj_a);
echo &#39;<br>&#39;;
var_dump($obj_b);
ログイン後にコピー
操作結果は次のとおりです:

object(A)[1]
 public &#39;val&#39; => int 30
 public &#39;b&#39; =>
 object(B)[2]
  public &#39;val&#39; => int 40
 
object(A)[3]
 public &#39;val&#39; => int 20
 public &#39;b&#39; =>
 object(B)[2]
  public &#39;val&#39; => int 40
ログイン後にコピー

ディープ クローン作成: のすべての属性データオブジェクトは完全にコピーされており、

マジックメソッド

clone() を使用し、ディープクローン作成

<?php
class B{
 public $val = 10;
}
class A{
 public $val = 20;
 public $b;
 public function construct(){
  $this->b = new B();
 }
 public function clone(){
  $this->b = clone $this->b;
 }
}
$obj_a = new A();
$obj_b = clone $obj_a;
$obj_a->val = 30;
$obj_a->b->val = 40;
var_dump($obj_a);
echo &#39;<br>&#39;;
var_dump($obj_b);
ログイン後にコピー
を実装する必要があります

object(A)[1]
 public &#39;val&#39; => int 30
 public &#39;b&#39; =>
 object(B)[2]
  public &#39;val&#39; => int 40
 
object(A)[3]
 public &#39;val&#39; => int 20
 public &#39;b&#39; =>
 object(B)[4]
  public &#39;val&#39; => int 10
ログイン後にコピー
結果は次のとおりです: rrreee

以上がphp__clone()のクローニング方法の詳細説明とシャロークローニングとディープクローニングの使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート