本文目錄一覽:
- 1、copy和mutableCopy和直接賦值的區別
- 2、php什麼是淺拷貝,深
- 3、在php中 clone 對象的值可以改變嗎?(對象1中$var=2, 對象2克隆對象1 ,對象2.$var=3,print 對象1.$var;)
- 4、對象賦值、淺拷貝和深拷貝
copy和mutableCopy和直接賦值的區別
Cocoa論壇的一個帖子中我看到了如下的說法(地 d.php?tid-135884.html)。
1、非容器對象
對不可變對象複製,copy是指針複製(淺拷貝)和mutableCopy就是對象複製(深拷貝)。
對可變對象複製,都是深拷貝,但是copy返回的對象是不可變的。
2、容器對象
對於容器本身,同非容器對象。
但是,對於容器內的對象,則都是指
php什麼是淺拷貝,深
php淺拷貝:賦值時,引用賦值,相當於取了一個別名。對其中一個修改,會影響另一個
深拷貝:賦值時值完全複製,完全的copy,對其中一個作出改變,不會影響另一個
PHP中, = 賦值時,普通對象是深拷貝,但對對象來說,是淺拷貝。也就是說,對象的賦值是引用賦值。(對象作為參數傳遞時,也是引用傳遞,無論函數定義時參數前面是否有符號)
在php中 clone 對象的值可以改變嗎?(對象1中$var=2, 對象2克隆對象1 ,對象2.$var=3,print 對象1.$var;)
對象克隆後,得到是一個對象的實例,並將數據複製一份,兩者各自的數據都是獨立的。請參看以下代碼:
?php
class corporatedrone {
private $employeeid;
private $tiecolor;
function setEmployeeID($employeeid) {
$this-employeeid = $employeeid;
}
function getEmployeeID() {
return $this-employeeid;
}
function setTiecolor($tiecolor) {
$this-tiecolor = $tiecolor;
}
function getTiecolor() {
return $this-tiecolor;
}
}
// 建立對象1
$drone1 = new corporatedrone();
// 設置對象1屬性
$drone1-setEmployeeID(“12345”);
$drone1-setTiecolor(“red”);
// 克隆對象1
$drone2 = clone $drone1;
// 設置對象2屬性
$drone2-setEmployeeID(“67890”);
// 輸出兩個對象的成員屬性
echo “對象1 employeeID: “.$drone1-getEmployeeID().”br /”;
echo “對象1 tie color: “.$drone1-getTiecolor().”br /”;
echo “對象2 employeeID: “.$drone2-getEmployeeID().”br /”;
echo “對象2 tie color: “.$drone2-getTiecolor().”br /”;
?
對象賦值、淺拷貝和深拷貝
賦值是將原對象的內存地址直接給到新對象
生成一個新的對象,新對象擁有原對象的所有屬性。如果屬性值的類型是基本類型,就將原屬性的值拷貝過來;如果屬性值是引用類型,就將原屬性值的地址拷貝過來,如果原屬性值發生改變時,新屬性的值也會發生改變。
將原對象中的各個屬性值重新分配內存地址,不論原對象的屬性值是基本類型還是引用類型,原對象屬性值的變化都不會影響新對象的屬性值。
這種方法雖然可以實現數組或對象深拷貝,但不能處理函數和正則,因為這兩者基於JSON.stringify和JSON.parse處理後,得到的正則就不再是正則(變為空對象),得到的函數就不再是函數(變為null)了
原創文章,作者:BYWC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131418.html