php引用複製,淺複製clone和深複製

2022-07-11 02:51:11 字數 2158 閱讀 3449

1.引用複製

<?php 

class a

$a=new a();

$b=$a; //引用賦值

$a->info="10";

echo $a->info."

";echo $b->info."

";die;

結果如下:

2.淺複製clone

<?php 

class a

$a=new a();

$b=clone $a; //clone

$a->info="10";

echo $a->info."

";echo $b->info."

";die;

結果如下

那麼為什麼叫淺複製呢,因為它只能複製類裡面的屬性和方法,如果類裡面的屬性和方法用到的其他的物件,那麼複製過去的也是引用複製,如下:

<?php 

class mybianliang

public function changebianliang($bianliang2)

}class mytest

}$a=new mytest(10);

$b= clone $a; //clone

echo $a->test->bianliang."

";

$a->test->changebianliang(20); //改變a物件中test物件中的屬性值,看看b物件中的test物件中的屬性可有變化

echo $b->test->bianliang."

";die;

結果如下:

這說明 $b物件中的$test物件指向的是$a物件的$test物件,那麼如何避免呢

用__clone魔術方法把類中用的其他物件重新clone一下

<?php 

class mybianliang

public function changebianliang($bianliang2)

}class mytest

public function __clone()

}$a=new mytest(10);

$b= clone $a; //clone

echo $a->test->bianliang."

";

$a->test->changebianliang(20); //改變a物件中test物件中的屬性值,看看b物件中的test物件可有變化

echo $b->test->bianliang."

";die;

結果如下

3.深複製

深複製,可以利用上面的魔術方法__clone()或者利用序列化和反序列化的方法

<?php 

class mybianliang

public function changebianliang($bianliang2)

}class mytest

}$a=new mytest(10);

$b = unserialize(serialize($a)); //序列化和反序列化

echo $a->test->bianliang."

";

$a->test->changebianliang(20); //改變a物件中test物件中的屬性值,看看b物件中的test物件可有變化

echo $b->test->bianliang."

";die;

執行結果

淺複製 深複製 clone

clone與cloneable的關係 clone是object的乙個方法,cloneable是乙個標記介面。任何類都有clone 方法,但是只有實現了cloneable介面才能呼叫該方法,否則丟擲clonenotsupportedexception異常。淺複製 淺拷貝 僅複製引用,即兩個引用指向同乙...

js陣列賦值 引用 深複製 淺複製

如 var a 1,2,3,4 var b b a 這個不是把值賦值過去而是b作為a的引用,b改變的是a 如何b指向的是乙個新陣列,a把元素值全部賦值過去?1 普通陣列可以使用varb concat a 2 我遇到乙個jquery物件型別的陣列是 object array 型別,其拼接的陣列字串為 ...

淺複製 深複製

second,來說說shallow copy and deep copy的定義和我自己的一些理解。僅供參考 淺複製 shallow copy 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...