物件的複製時有三種方案:
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教學有興趣的朋友有幫助。