首頁 >後端開發 >php教程 >php物件導向Clone與序列化

php物件導向Clone與序列化

WBOY
WBOY原創
2016-08-08 09:22:481018瀏覽

物件的複製時有三種方案:

1,直接複製  $a = $b

這種是淺拷貝,當

這種是淺拷貝,當改變$a的時候改變他們指的是同一塊堆區

2,clone複製 $a = clone $b

這種拷貝貌似是深拷貝,當$a發生變化的時候跟著$ba發生變化變化,同時PHP提供了魔術方法__Clone()可以自訂Clone複制,哪些屬性不想被複製,複製過程中需要哪些改變,都可以在__clone()方法中自訂。 但是這種複製的方法有個缺陷,需要注意,如果類中的某個屬性的類型是另外一個類,那麼在Clone的時候這個屬性會不會被深拷貝,是不是很尷尬,當然這點缺陷是可以用魔術方法__clone來彌補的,在__clone()方法中為這個屬性new一個

新的類就是了。

	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

使用clone彌補

		public function __clone(){
			$this->name='null';
			$this->demo = new demo('init');
		}
這樣不需要使用clone魔術方法既可以實現屬性中引用類型的深拷貝了。

以上就介紹了php物件導向Clone與序列化,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn