我在PHP docs comments中发现了这个非常古老的评论,但我无法理解为什么它在第一个例子中输出“hihaha”而不是“eita”。 $a
已更改,我认为"hihaha"
已被删除。如果没有,那么为什么如果更改为null
或指定另一个变量的副本,那么"hihaha"
IS是否已被删除?
// 1. example
$a = "hihaha";
$b = &$a;
$c = "eita";
$a = &$c; // why doesn't this purge "hihaha" from existence?
echo $b; // shows "hihaha" WHY?
// 2. example
$a = "hihaha";
$b = &$a;
$a = null;
echo $b; // shows nothing (both are set to null)
// 3. example
$a = "hihaha";
$b = &$a;
$c = "eita";
$a = $c;
echo $b; // shows "eita"
这是否是循环引用问题的“好方法”?
答案 0 :(得分:2)
从$a = "hihaha";
开始,当您执行$b = &$a;
时,$b
不引用$a
。它引用了$a
的内容。正如PHP: What References Do中所述:
$ a和$ b在这里完全相同。 $ a不指向$ b,反之亦然。 $ a和$ b指向同一个地方。
然后在$c = "eita";
之后,当您$a = &$c;
时,$a
现在引用$c
(“eita”)的内容。
这根本不会影响$b
。 $b
仍在引用$a
(“hihaha”)的原始内容。将$a
指向别的东西不会改变它。
如果您有更多mspaint学习风格,这里有一个视觉辅助,代表示例1的前四个语句:
在第二个示例中,$a
和$b
在$a
设置为null
时仍然指向相同的内容,因此$b
现在正在引用null
也是如此。目测:
答案 1 :(得分:0)
将变量视为指向引用 - 分解示例1 ...
<强> 1 强>
$a = "hihaha";
$a
指向字符串hihaha
的引用,我们称之为 R1
<强> 2 强>
$b =& $a;
我们在这里说,将$b
指向与$a
相同的引用( R1 )
第3 强>
$c = "eita";
$c
指向字符串eita
的引用,我们称之为 R2
<强> 4 强>
$a =& $c;
现在我们说,将$a
指向与$c
相同的引用($b
仍然指向 R1 )
现阶段,
$a
和$c
指向 R2 ,
$b
指向 R1
- 应该很容易猜到接下来会发生什么!
<强> 5 强>
echo $b; // hihaha
我们现在知道echo
$b
将输出 R1 !
希望有所帮助!