php的 变量赋值类型为对象的一些问题

变量赋的值为对象默认是引用传值

图示所写 变量赋的值为对象类型默认是引用传值。也就是指向同一个内存空间

下面给出另一段代码和结果图
图片描述

结果如下
图片描述

问题:既然变量赋值类型为对象都是引用传值,为什么结果来看,$assigned更像是赋值传值,如果是引用传值,改变为null,三个变量不是都应该为null吗?!

阅读 3.2k
3 个回答

首先你得理解GC的原理,
改变null使对象回收,是没有指针指向他的时候,而你这时候还是有一个$reference指向,
你加了一个& 只是把当前栈区变量引用, 所以你销毁第三个变量,第一个也会被销毁。
我打印的时候是这样的:
class A#1 (1) #号后面就是代表是第几个new出来的对象, 如果你不赋值为null,你会发现他们三个都是1的。

不知道你知不知道深复制和浅复制,值的复制,是深复制,就是说改变了就改变了,不会影响另外一个:例如
$a=1;
$b=$a;
$a=2
echo $a;//2
echo $b;//1

对象的复制是浅复制,他的更改会影响到另外一个,这个楼主你应该懂,所以,当assigned=$instance,后,对instance的修改,会影响assigned ,如果没有最后的null,$instance和assigned是一样的。关键就是最后的null,null其实也是一个对象,说到这里,我相信你应该明白了,$instance=null,这个时候,instance被指向了另外一个对象(跟assigned没半毛钱关系了),而reference又是指向instance,跟着也指向了null对象,所以你明白了么?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题