关于php的对象复制和引用

作者: 简书说我的昵称违规 | 来源:发表于2017-01-04 23:27 被阅读73次

也许你已经很了解你的对象了(当然前提是你得有个对象),但很可能你还不了解PHP的对象

首先来看一段代码

function debug($obj){
    echo '<pre>'.$obj.'</pre>';
}
class A{
    public  $a = 1;
}

$entityA = new A();  //实例化一个A对象
$entityB = $entityA;  //将实例 entityA 赋值给entityB 变量
debug($entityA->a);
debug($entityB->a);
$entityB->a = 2;
debug($entityB->a);
debug($entityA->a);

得到的结果是:

1
1
2
2

你一定很惊讶,为什么实例entityA的a属性也会被改变。
我们来看一下PHP官方是怎么说的。

在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作
为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

我们再回头来看看这段代码,将$entityA赋值给$entityB时,$entityA 和$entityB 都只是同一个标识符的拷贝。所以当$entityB->a =2 ,改变$entityB的属性时,其实已经改变了$entityA的a 属性。因为他们2个指向的时同一个内容。

特殊的场景

如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

这个时候你就需要克隆对象了,而不能进行简单的赋值。再加上一段代码。

$entityC = clone $entityA;
$entityC->a = 3;
debug($entityC->a);
debug($entityA->a);

得到的结果:

3
2

$entityA 对象A 的属性并没有因为 $entityC 的改变而改变,这就时clone 的作用。

相关文章

  • 关于php的对象复制和引用

    也许你已经很了解你的对象了(当然前提是你得有个对象),但很可能你还不了解PHP的对象 首先来看一段代码 得到的结果...

  • 关于php clone

    php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会...

  • 复制引用和复制对象的区别

    复制引用和复制对象的区别 复制引用:是指将某个对象的地址复制,所以复制后的对象副本的地址和源对象相同,这样,当改变...

  • iOS常见面试题

    1、浅复制和深复制的区别 浅层复制:只复制指向对象的指针,而不复制引用对象本身。 深层复制:复制引用对象本身。 意...

  • objective深浅拷贝

    浅复制和深复制的区别? 浅复制:只复制指向对象的指针,而不复制引用对象本身。 深复制:复制引用对象本身。 意思就是...

  • 深入浅出深度复制与浅度复制(demo)

    深度复制:复制一个对象时并且复制了该对象的引用(引用的引用。。。)。 浅度复制:仅仅复制该对象的成员变量(基本类型...

  • iOS面试题:浅复制和深复制的区别?

    浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。意思就是说我有个 A 对象,复制...

  • 深拷贝 & 浅拷贝

    浅拷贝:大多数对象都引用(指向)其他对象,不复制引用对象。新复制的对象只指向现有的引用对象。 例如 NSArray...

  • JS中的深浅复制

    什么是深浅复制? 深复制:把要复制的对象的所引用的全部对象都复制一遍。开辟新空间。 浅复制:仅仅复制对象的引用,而...

  • 关于深拷贝

    关于深拷贝 浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的...

网友评论

本文标题:关于php的对象复制和引用

本文链接:https://www.haomeiwen.com/subject/miuavttx.html