php物件的拷貝原理

2022-09-03 02:57:09 字數 1477 閱讀 8220

首先,先定義乙個類;

1

class

dog

$dog = new 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

$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

引用識別符號都是一致的,但是$dog2改變了他們的共同指向,使物件識別符號變成了字串"abc",那麼此時此識別符號不再是物件識別符號,而是乙個字串,則echo $dog->name就會報錯,echo $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中,賦值時,普通物件是深拷貝,但對物件來說,是淺拷貝。也就是說,物件的賦值是引用賦值。物件作為引數傳遞時,也...