オブジェクトのコピーには 3 つのオプションがあります:
1、直接コピー $a = $b
これは浅いコピーです。$a が変更されると、$b も変更されます。同じヒープ領域を指しています
2、clone copy $a = clone $b
このコピーは、$a が変更されると、$b は追随しません。同時に、PHP には、クローン レプリケーションをカスタマイズするためのマジック メソッド __Clone() が用意されており、コピーしたくない属性やレプリケーション プロセス中に必要な変更は __clone() メソッドでカスタマイズできます。
ただし、このコピー方法には欠陥があります。クラス内の特定の属性の型が別のクラスである場合、この属性は Clone 中にディープコピーされないことに注意してください。もちろん、この欠点は __clone() メソッドでこの属性に新しい 新しいクラス を作成するだけで補えます。
class test{ private $name; private $sex; private $demo; public function __construct($name,$sex,$demo){ $this->name = $name; $this->sex = $sex; $this->demo = $demo; } public function __set($key,$value){ $this->{$key} = $value; } public function __get($key){ return $this->{$key}; } public function __clone(){ $this->name='null'; //这里可以自定义clone } }
class demo{ private $name; public function __construct($name='demo01'){ $this->name = $name; } public function __set($key,$value){ $this->{$key} = $value; } public function __get($key){ return $this->{$key}; } }
$t = new test('aa', 'bb',new demo('d01')); $d = clone $t; //$d->name='nihao'; $d->demo->name = 'd02'; var_dump($t); //结果 $t->demo->name d02
クローンを使って補ってください
public function __clone(){ $this->name='null'; $this->demo = new demo('init'); }
3、シリアル化されたコピー
$b = unserialize(serialize($t));