>백엔드 개발 >PHP 튜토리얼 >PHP 객체지향 복제 및 직렬화

PHP 객체지향 복제 및 직렬화

WBOY
WBOY원래의
2016-08-08 09:22:481011검색

개체 복사에는 세 가지 옵션이 있습니다.

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, 연재본

이렇게 하면 clone 매직 방식을 사용하지 않고도 속성에서 참조 유형의 깊은 복사를 구현할 수 있습니다.

위 내용은 내용의 측면을 포함하여 PHP 객체지향 Clone 및 직렬화에 대해 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

$b = unserialize(serialize($t));
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.