php深轉殖和淺轉殖

2021-06-22 02:42:03 字數 1576 閱讀 7547

先來看下php對轉殖的定義:

你可能會想複製乙個新的物件,保持所有屬性與原來的物件的屬性相同, 但必須是乙個新的物件(因為如果不是新的物件,那麼乙個物件中的改變就會影響到另乙個物件)。還有一種情況: 如果物件a中儲存著物件b的引用,當你複製物件a時,你想其中使用的物件不再是物件b而是b的乙個副本,那麼 你必須得到物件a的乙個副本。

意思就是複製完以後的物件你所看到的屬性神馬的可能沒有變化,但是卻是乙個新的物件了。根據這個定義來定義兩個簡單的類來看下效果:

class a

$a = new a;     

$b = clone $a;     //這裡是對$a的複製,複製物件的語法是$copy_of_object = clone $object;

$a->name = "小李";   

var_dump($a);

echo "

";var_dump($b);

輸出結果如下:

object(a)#1 (2)  

object(a)#2 (2)

通過結果我們可以看出object(a)#1這個指的是列印$a所顯示結果,而object(a)#2,雖然都是類a的物件,但是乙個編號是1,乙個編號是2,完全是兩個類,而且當我複製完成後,改變其中乙個物件的值,不會影響另外的乙個物件的值。這種複製方式被稱作為淺轉殖。其實也就是通過乙個關鍵字clone搞定的。不過如果想讓複製後的物件和被複製的物件有所差別,可以使用魔術方法__clone()來完成。也就是在類裡面加上乙個方法(比如我想讓複製後的物件年齡為20):public function __clone()

__clone()魔術方法會在  $b = clone $a;   的時候自動呼叫,複製物件a的時候同時改變了它的$age的值。

這種淺轉殖只能將當前的屬性進行轉殖,但是如果當前的屬性是物件的時候,淺轉殖就滿足不了我們的需求了,這時候就需要用到深轉殖,所謂的深轉殖就是

物件屬性如果為物件,則將其生成轉殖副本。在__clone()的方法的基礎上,將型別為物件的屬性進行轉殖。再其基礎上更改如下:

class a

}class  b

$a = new a; 

$a->obj = new b;    //這裡是以b作為$obj的類的定義,將b例項化,物件儲存在$a->obj

$b = clone $a;     //這裡是對$a的複製,複製物件的語法是$copy_of_object = clone $object;

$a->name = "小李";   

var_dump($a);

echo "

";var_dump($b);

結果如下:

object(a)#1 (3) } 

object(a)#3 (3) }

這裡可以看到obj屬性儲存的物件明顯是乙個物件(都為object(b)#2)

但是如果我們想在複製的時候讓$obj這個物件也重新複製成乙個新的物件,那麼這個時候只需要改動__clone()方法

public function __clone()

結果如下:

object(a)#1 (3) } 

object(a)#3 (3) }

至此,物件的複製才算完成。

轉殖,深轉殖和淺轉殖

轉殖,深轉殖和淺轉殖。1.實現轉殖,繼承cloneable介面,實現clone beanutils.clonebean origin 2.深轉殖和淺轉殖的區別,淺轉殖指的是轉殖的時候僅僅轉殖物件本身 物件的基本變數 而不拷貝物件的引用變數。深轉殖指的是轉殖的時候不僅轉殖物件本身,而且拷貝物件包含的引...

深轉殖和淺轉殖

為什麼需要轉殖?new出來的物件中的屬性都是初始化時候的值,當需要乙個新的物件來儲存當前物件的 狀態 就靠clone方法了。直接使用object a new object object b b a不行嗎,答案是不行的。因為這只是轉殖了引用。如何實現轉殖?首先由兩種轉殖的方式,乙個是深轉殖,乙個是淺轉...

淺轉殖和深轉殖

1淺轉殖 shallow copy 是通過呼叫object的clone方法,建立出和原物件 結構相同的新物件。淺轉殖 和深轉殖 deep copy 不同,如果被拷貝的物件屬性為可變類,則直接複製該引用物件的位址。這會導致,淺轉殖出來的物件 如果改變可變類屬性值,則原物件的可變類屬性值也會一起變。換句...