为了账号安全,请及时绑定邮箱和手机立即绑定

clone和=&的区别

我记得之前学习变量的时候有说到=和=&的区别。

$a = 10;

$b = $a;        //赋值,内容相同,地址不同。

$c =& $a;     //引用赋值,两个变量都指向同一个数据,共享同一块内存。

所以当$a变化的时候,$c会跟着变化,而$b保持原来的值不变。

*******************************************************************

那为什么到了对象这边就不一样了呢?

$obj1 = $obj; 引用,两个对象变量指向同一对象,当改变$Object1对象时,$Object2也做相同的变化。

            (如果这个成立,那之前说到析构函数的时候,为什么当$obj=null的时候,$obj1没有跟着变化?如果都变化了,那应该触发析构函数了;而老师当时说要 $obj1=&$obj,这样$obj=null的时候才会直接触发析构函数。)


$obj1 = clone $obj; 克隆,克隆的对象$Object1与原来的对象没有任何关系,它是将原来的对象从当前位置从新复制了一份。

            (这个听上去就和变量赋值$b = $a一模一样诶。难道对象实例化之后赋值给$obj,这个$obj不是一个变量么?)



正在回答

4 回答

上面你对变量的引用理解没有问题;说下对象引用这一块,通常情况默认情况下对象是通过引用传递的,所以视频里$james1 = $james相当于$james1 = &$james,$james->name改变也会导致$james1的name改变;$obj1=$obj;$obj=null的时,如果按正常思维就是引用传递的话,$obj1也应该是null,但结果显然不是,就说明上面那句话不准确,下面这句话你要好好理解,

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

这就能解释为什么$obj1=$obj;$obj=null,按照文档来说的话两个对象变量并不是引用关系,简单理解的话这时候$obj1=$obj可以理解为赋值,$obj=null,但是$obj1没有跟着变化,因为$obj保存的只是一个标识符,改变了标识符的内容,但是真正的内容并没有改变,所以$obj1没有变化,也可以按上面变量那里理解成单纯赋值,即是内容相同,地址不同。

http://www.php.net/manual/zh/language.oop5.references.php对象引用的官方文档,希望能帮到你,

0 回复 有任何疑惑可以回复我~
#1

Gemma_Tong 提问者

非常感谢!
2017-03-13 回复 有任何疑惑可以回复我~
#2

Gemma_Tong 提问者 回复 Conqueror1st

我大概明白了,你待会看下我回复的下层楼~我图解看下 你看看对不对。
2017-03-13 回复 有任何疑惑可以回复我~
#3

Conqueror1st 回复 Gemma_Tong 提问者

好的~我也是刚自学不久,可能说的不是很清楚
2017-03-13 回复 有任何疑惑可以回复我~
#4

Gemma_Tong 提问者 回复 Conqueror1st

发了,你看下→_→
2017-03-13 回复 有任何疑惑可以回复我~
查看2条回复

谢谢! 

0 回复 有任何疑惑可以回复我~

根据你@Conqueror1st 的回答,我做了这个图,不知道是否正确。

http://img1.sycdn.imooc.com//58c63f920001bad606900301.jpg

(1)$obj1 =& $obj

两个对象变量引用赋值,保存的是同一个地址的标识符。

这种情况下,$obj1=null的话,也就是相当于ID1被清空,所以这时候对象A就没有引用了,触发了析构函数。


(2)$obj2=$obj

两个对象变量赋值,值相同都是标识符,但是存储在不同的地址,这个标识符都指向同一个地址——对象A。

这种情况下

1)$obj2=null,相当于ID2被清空,那么ID2指向对象A的引用没有了,这时候对象A还有ID1在引用,所以没有触发析构函数。

2)修改$obj2的属性,比如$obj->name = 'James',这时候修改的是指针指向的对象A的内容,所以一样在引用对象A的$obj也会同步修改了name这个属性。


(3)$obj3=clone $obj

对象复制,新增一个内存地址存储对象B,B的所有属性和方法和A一模一样,只是地址不同。当然,标识符也是不同的地址和内容(内容不同是因为指向不同的地方)

这种情况下,修改$obj3的属性对$obj毫无影响,因为大家都是殊途殊归!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

未知是否这样理解。如果有错千万指正啊o(╯□╰)o

2 回复 有任何疑惑可以回复我~
#1

Conqueror1st

我认为这样理解是对的~感觉你的理解比我透彻啊!
2017-03-13 回复 有任何疑惑可以回复我~
#2

Gemma_Tong 提问者 回复 Conqueror1st

图解之后会容易理解一点。也是你提醒了我啊没想到这个对象变量和普通变量会有这些差别→_→
2017-03-13 回复 有任何疑惑可以回复我~
#3

Conqueror1st 回复 Gemma_Tong 提问者

我也查了一些资料,还是官网那个说的最清楚,以后有问题还是要多去官网看
2017-03-13 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

clone和=&的区别

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信