首先,先定義乙個類;
1$dog = new dog();class
dog
1>
直接複製拷貝
$dog2 = $dog;
1執行結果:$dog = new
dog();
2$dog2 = $dog;3
$dog->name = "yellow";
4$dog->age = '18';
5var_dump($dog,$dog2);6
echo "
".$dog2->name."";7
$dog->name = "black";
8echo
$dog2->name."
";
可以看出,$dog,$dog2的物件識別符號是一樣的。 直接賦值的這種拷貝只是 拷貝了 物件識別符號的乙個副本而已,但是物件識別符號的資料指向並沒有改變,都是指向同一塊資料塊。
2>
引用複製拷貝(賦值引用)
$dog2 = &$dog;
1引用識別符號都是一致的,但是$dog2改變了他們的共同指向,使物件識別符號變成了字串"abc",那麼此時此識別符號不再是物件識別符號,而是乙個字串,則echo $dog->name就會報錯,echo $dog2就會輸出 "abc";$dog = new
dog();
2$dog->name = "yellow";
3$dog->age = '18';
4$dog2 = &$dog;5
var_dump($dog,$dog2);6
$dog2 = "abc";
7echo
$dog->name;//此時,$dog變成乙個字串,不再是物件了。
8echo
$dog2."
";//輸出:abc
3>轉殖拷貝
$dog2 = clone $dog;
1輸出結果如下:$dog = new
dog();
2$dog->name = "yellow";
3$dog->age = '18';
4$dog2 = clone
$dog;5
var_dump($dog,$dog2);6
echo
$dog->name."";7
$dog->name = "black";
8echo
$dog->name."";9
echo
$dog2->name."
";
兩者的物件識別符號是不同的,這就意味著指向的資料塊也是不用的,此時輸出$dog->name以及改變$dog->name都不會影響$dog2的資料。
PHP 物件的深拷貝與淺拷貝
先說一下深拷貝和淺拷貝通俗理解 深拷貝 賦值時值完全複製,完全的copy,對其中乙個作出改變,不會影響另乙個 淺拷貝 賦值時,引用賦值,相當於取了乙個別名。對其中乙個修改,會影響另乙個 php中,賦值時,普通變數是深拷貝,但對物件來說,是淺拷貝。也就是說,物件的賦值是引用賦值。物件作為引數傳遞時,也...
物件深拷貝原理函式
深拷貝 兩者之間改變互不影響 1 拷貝後兩者之間不再存在共享關係 2 拷貝之後資料型別不能發生改變,也就是需要判斷是陣列的時候,需要進行單獨遞迴的遍歷 3 在繼承的時候,我們通過原型屬性實現原型物件屬性的繼承,在進行深拷貝的時候,我們首先需要提出原型物件上的屬性 通過hasownproperty方法...
PHP中物件的深拷貝與淺拷貝
先說一下深拷貝和淺拷貝通俗理解 深拷貝 賦值時值完全複製,完全的copy,對其中乙個作出改變,不會影響另乙個 淺拷貝 賦值時,引用賦值,相當於取了乙個別名。對其中乙個修改,會影響另乙個 php中,賦值時,普通物件是深拷貝,但對物件來說,是淺拷貝。也就是說,物件的賦值是引用賦值。物件作為引數傳遞時,也...