標籤:影響 一個 並且 記憶體位址 .com html 需要 相同 ble
php 複製 clone
在實際編程過程中,我們常常要遇到這種情況:有一個對象A,在某一時刻A中已經包含了一些有效值,此時可能會需要一個和A完全相同新對象B,並且此後對B任何改動都不會影響到A中的值,也就是說,A與B是兩個獨立的對象,但B的初始值是由A對象確定的。
在php語言中,用簡單的指派陳述式是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現clone()方法是其中最簡單,也是最高效的手段。
核心:
$obj = new MyCloneable();
$obj2 = clone $obj;
所有的屬性中的引用 仍然不變,指向原來的變數。
class ByRef{ var $prop; function __construct() { $this->prop =& $this->prop;//&地址引用 指向同一個記憶體位址 $this->prop1 = ‘haha, i am here‘; } function __clone() { $this->prop=2;// $a->prop is now 2 }}$a = new ByRef;$a->prop = 1;echo ‘原對象: ‘;var_dump($a);echo ‘<br><br>‘;$b = clone $a;//本句替換成 $b=$a,結果也還是3,不過不會觸發ByRef::__clone, prop不會中間變成2。本例研究的是複製後,$b->prop引用不變echo ‘原對象: ‘;var_dump($a);echo ‘<br>‘;echo ‘clone 對象: ‘;var_dump($b);echo ‘<br><br>‘;$b->prop = 3; // $a->prop is now 3$b->prop1 = ‘oh,u move‘; // b的prop1 改變了,a的prop1沒變echo ‘原對象: ‘;var_dump($a);echo ‘<br>‘;echo ‘clone 對象: ‘;var_dump($b);echo ‘<br><br>‘;echo ‘原對象的引用prop: ‘;echo $a->prop;echo ‘<br>‘;echo ‘clone 對象的引用prop: ‘;echo $b->prop;
###################結果###################
原對象: object(ByRef)#6 (2) { ["prop"]=> &int(1) ["prop1"]=> string(15) "haha, i am here" }
原對象: object(ByRef)#6 (2) { ["prop"]=>&int(2) ["prop1"]=> string(15)"haha, i am here" }
clone 對象: object(ByRef)#7 (2) { ["prop"]=>&int(2) ["prop1"]=> string(15)"haha, i am here" }
原對象: object(ByRef)#6 (2) { ["prop"]=>&int(3) ["prop1"]=> string(15)"haha, i am here" }
clone 對象: object(ByRef)#7 (2) { ["prop"]=>&int(3) ["prop1"]=> string(9) "oh,umove" }
原對象的引用prop: 3
clone 對象的引用prop: 3
轉http://blog.sina.com.cn/s/blog_54e38bdc0100xhm7.html
php 複製 __clone