图示所写 变量赋的值为对象类型默认是引用传值。也就是指向同一个内存空间
下面给出另一段代码和结果图
结果如下
问题:既然变量赋值类型为对象都是引用传值,为什么结果来看,$assigned更像是赋值传值,如果是引用传值,改变为null,三个变量不是都应该为null吗?!
图示所写 变量赋的值为对象类型默认是引用传值。也就是指向同一个内存空间
下面给出另一段代码和结果图
结果如下
问题:既然变量赋值类型为对象都是引用传值,为什么结果来看,$assigned更像是赋值传值,如果是引用传值,改变为null,三个变量不是都应该为null吗?!
首先你得理解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对象,所以你明白了么?
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答1.4k 阅读✓ 已解决
798 阅读
649 阅读
答案已自行百度到 想了解的看这篇文章 https://www.zhihu.com/questio...