PHP對象的淺復(fù)制與深復(fù)制的實例詳解?
原型模式
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象
原型模式是基于深復(fù)制和淺復(fù)制的,在Java里面有2種復(fù)制:
淺復(fù)制
將一個對象復(fù)制之后,生成一個新的對象,新對象的所有成員變量(基本類型或引用類型)都含有與原
有對象相同的值,如果原有對象的成員變量是基本數(shù)據(jù)類型,就會將這個變量的值拷貝一份到新對象
里面,如果原有對象的成員變量是引用數(shù)據(jù)類型,那么這個引用指向的對象不會新生成一份,而是,
在新對象里面的這個引用跟原有對象的引用指向的是同一個對象。
深復(fù)制
將一個對象復(fù)制之后,生成一個新的對象,新對象的基本數(shù)據(jù)類型變量含有與原有對象相同的值,如
果原有對象的成員變量是引用數(shù)據(jù)類型,在新對象里面,這些引用變量將指向被復(fù)制過的新對象,而
不再是指向原有的那些被引用的對象,深復(fù)制把要復(fù)制的對象所引用的對象都復(fù)制一遍。
比如:
有一個A對象,經(jīng)過復(fù)制之后產(chǎn)生一個B對象,如果A里面有一個int型的變量i值為4,那么B對象里面
的inti的值也是4,A對這個int型變量的改變,不會影響B(tài),如果A里面有一個成員變量c是引用類型
的,它指向了對象D,經(jīng)過復(fù)制,B里面也會有一個c,這個c也指向D對象,A的c和B的c指向的是同一個
對象D,這就是淺復(fù)制。如果是深復(fù)制,A里面的c指向一個D對象,對于B里面的c會指向一個新的對象
,他們指向的不是同一個對象,這樣,在原有對象里面對成員變量c指向的對象D做的任何改變,不會
影響新對象。
舉個最簡單的例子:
classA{
publicinti;
publicintj;
}
Aa=newA();
淺拷貝:
Aa1=a;
深拷貝:
Aa1=newA();
a1.i=a.i;
a1.j=a.j;
感覺如下:
淺拷貝只拷貝對象本身
深拷貝則拷貝對象中引用的對象,一直拷貝下去。