您的位置:

php对象深拷贝,php浅拷贝和深拷贝的区别

本文目录一览:

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)了