stdClass对象和Shadow Copy奇怪的输出

时间:2013-10-04 06:54:19

标签: php oop shadow-copy

我使用引用对象跟随stdClass对象及其赋值。但是,在unset ting unset($A);仍然$B输出$A之前的值之后,即使为$A的{​​{1}}属性分配了新值, 。请参阅下面的曲目。

->foo

修改

问题是<?php $A = new stdclass; $A->foo = 'AAA'; echo "Ouput $ A:"; echo "<pre>"; print_r($A); /* stdClass Object ( [foo] => AAA ) */ $B = &$A; unset($A); $A = new stdclass; $A->foo = 'aaa'; echo "after unset $ A and again assigning new value. Ouput $ A:"; echo "<pre>"; print_r($A); /* prints like stdClass Object ( [foo] => aaa ) */ echo "Ouput $ B:"; echo "<pre>"; print_r($B); /* prints like stdClass Object ( [foo] => AAA ) */ 被分配了$B的引用,但是在$A未设置之后

  1. 如何打印以前指定的值$A
  2. 的值
  3. 如果$A未设置且$A打印的值为$B,那么它应该打印$A的新值吗?
  4. 正如我们所知$A如果Shadow Copy对象是source那么vanished/destroyed对象无法指向reference对象所指向的位置。

2 个答案:

答案 0 :(得分:2)

不要说unset($A),而是将其设为NULL。在不同的情况下,Unset有很多不同的行为,manual值得一看。

$A=NULL;
//unset($A);

<强> Fiddle

答案 1 :(得分:1)

  

如何打印以前指定的$ A值?

$A标识的对象由$B引用。这就是unset($A)不能垃圾收集对象的原因。

  

如果未设置$ A且$ B打印价值为$ A,那么它应该打印$ A的新值?

不,unset打破了$A$B之间的联系。之后,$A = new stdclass创建一个新变量(恰好具有相同的名称)。