根据你@Conqueror1st 的回答,我做了这个图,不知道是否正确。
(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