本文目录一览:
- 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)了