개체 복사에는 세 가지 옵션이 있습니다.
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'); }
이렇게 하면 clone 매직 방식을 사용하지 않고도 속성에서 참조 유형의 깊은 복사를 구현할 수 있습니다.
위 내용은 내용의 측면을 포함하여 PHP 객체지향 Clone 및 직렬화에 대해 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.
$b = unserialize(serialize($t));