请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对象显示引用和隐式引用有区别吗

如果说对象赋值默认是引用,那么显示的加上&后,将对象置为null,显式引用赋值得到的变量也为null,但一般赋值得到的变量还是原来的值,那么对象赋值默认返回的引用和显示的引用不是同一个东西?

正在回答

2回答

对象无论是否使用&,都会有同样的效果,你前面描述的可否使用代码在跟我说一下

0 回复 有任何疑惑可以回复我~
提问者 qq_神忘_03495758 2017-10-10 09:46:25
$instance=new testClass;
$assign=$instance;
$reference=&$instance;
$instance=null;
var_dump($assign);//object(testClass)
var_dump($reference);//null

如果是同样的效果为什么会有这个不同

0 回复 有任何疑惑可以回复我~
  • Jason #1
    是这样,对象是存储在堆当中,而引用对象的变量是存储在栈当中,这样就不难理解,$instance = new testClass; 生成一个栈地址,存储$instance的地址,例如为0x00001,又生成一个堆空间存储对象,这个栈指向这个堆,当$assign = $instance时,首先生成新的栈空间存储$assign的地址,例如 0x000002,同时指向上述对象的堆空间,因为对象是引用赋值,当我们采用 $reference = &$instance时,是将$instance的栈地址引用给了 $reference,并不是对象的堆空间,因此,当对$instance设置为null时,其栈空间变成了null,也就是取消了对对象堆空间的引用,而此时$reference也是引用$instance的栈地址,因此也变成了null,同样取消了对对象堆空间的引用,而$assign始终没有发生改变,因此导致以上结果!
    回复 有任何疑惑可以回复我~ 2017-10-10 18:59:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信