在PHP編程中,經(jīng)常會(huì)遇到需要將一個(gè)類(lèi)的實(shí)例拷貝到另一個(gè)地方的情況。這時(shí)候,就需要使用到PHP的類(lèi)拷貝功能。
在PHP中,有兩種拷貝方式:淺拷貝和深拷貝。
淺拷貝是指拷貝一個(gè)對(duì)象,但是該對(duì)象中的引用類(lèi)型的數(shù)據(jù)成員只是拷貝了引用而已。這意味著,如果原對(duì)象中的引用類(lèi)型的數(shù)據(jù)成員發(fā)生了改變,那么拷貝出來(lái)的對(duì)象也會(huì)受到影響。
來(lái)看一個(gè)例子:
class MyClass { public $a = 1; public $b = array(); public function add($value) { array_push($this->b, $value); } } // 淺拷貝 $c1 = new MyClass(); $c1->add('foo'); $c2 = clone $c1; $c1->add('bar'); var_dump($c1->b); // array('foo', 'bar') var_dump($c2->b); // array('foo', 'bar')
可以看到,在淺拷貝過(guò)程中,$c1和$c2的$b屬性都指向同一個(gè)數(shù)組。因此,當(dāng)我們?cè)?c1中給$b數(shù)組增加了一個(gè)元素后,$c2中的$b數(shù)組也隨之改變了。
相對(duì)于淺拷貝,深拷貝則會(huì)遞歸地將一個(gè)對(duì)象中所有引用類(lèi)型的數(shù)據(jù)成員都復(fù)制一份。這樣,即使原對(duì)象中的引用類(lèi)型的數(shù)據(jù)成員發(fā)生了改變,拷貝出來(lái)的對(duì)象也不會(huì)受到影響。
來(lái)看一個(gè)使用深拷貝的例子:
class MyClass { public $a = 1; public $b = array(); public function add($value) { array_push($this->b, $value); } } // 深拷貝 $c1 = new MyClass(); $c1->add('foo'); $c2 = unserialize(serialize($c1)); $c1->add('bar'); var_dump($c1->b); // array('foo', 'bar') var_dump($c2->b); // array('foo')
在深拷貝的例子中,我們將$c1序列化之后,又進(jìn)行了一次反序列化,從而得到了一個(gè)與原對(duì)象完全相同但是卻是獨(dú)立的對(duì)象$c2。