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 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...