php 像其他的語言一樣可以有變數的賦值功能,利用賦值操作符 =
一般情況下php儲存變數的結構是 zval,
但是儲存物件用的資料結構是:object store
在用到= 和 函式引數傳遞的時候,傳遞過來的都是zval 的指標
這個是時候兩個變數使用的都是同乙個物件 ,改變其中任何乙個物件的值,在另乙個變數指向的值中也會改變
這些賦值的複製都是淺複製
為了改變乙個變數,另外乙個不跟著改變,php創造了另乙個操作 clone
使用clone以後會把clone物件和原來的物件使用的是不同的儲存object store,但是對這個物件中使用的類還是引用型別的
可以使用魔方函式__clone(),可以在這個函式裡指定應用隊形的時候使用new
還有一種是序列化,可以更直接的使用
var2 = unserialize(serialize(var1))
參考:這篇文章裡寫的非常的詳盡,有相應的**佐證,建議去看一看
PHP寫時複製, 變數複製和物件複製不同
2016年3月18日 15 09 28 星期五 一直以為php物件也是寫時複製.其實 php的變數是寫時複製,物件是引用的 寫時複製 a b 如果 b的內容不改變,a和 b指向同一塊記憶體 如果 b內容改變了,a的內容是不會改變的,而是為 b重新申請空間存放資料 但是 物件 objtest1 obj...
php物件當引數傳遞 php深複製和淺複製
把物件當引數傳遞給方法,在方法裡改過物件後,影響到外面的物件 因為物件是引用傳遞過去的 class book public function getname oldobj new book hongjun serializeoldobj serialize oldobj newobj oldobj ...
PHP物件的淺複製與深複製的例項詳解
最近在看原型模式時注意到這個問題 php中物件 與 clone 的區別 例項 聚合類 class obja 只有實現了下面方法聚合類 才能實現深複製 function clone class objb 原型物件 obja new obja 複製物件 複製引用 obja2 obja obja2 num...