当包含它的原始变量具有新的引用值时,引用值如何保留在内存中?

时间:2016-10-06 13:54:59

标签: php reference pass-by-reference

我在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"

这是否是循环引用问题的“好方法”?

2 个答案:

答案 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的前四个语句:

enter image description here

在第二个示例中,$a$b$a设置为null时仍然指向相同的内容,因此$b现在正在引用null也是如此。目测:

enter image description here

答案 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

希望有所帮助!

阅读http://php.net/manual/en/language.references.whatdo.php