對象的複製時有三種方案:
1,直接複製 $a = $b
這種是淺拷貝,當改變$a的時候$b也會改變,因為他們指向的是同一塊堆區
2,clone複製 $a = clone $b
這種拷貝貌似是深拷貝,當$a發生變化的時候$b不會跟著變化,同時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');}
3,序列化複製
$b = unserialize(serialize($t));
這樣不需要使用clone魔術方法既可以實現屬性中參考型別的深拷貝了。
以上就介紹了php物件導向Clone與序列化,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。