【问题标题】:How can a referenced value stay in memory when the original variable that holds it has a new referenced value?当保存它的原始变量具有新的引用值时,引用值如何保留在内存中?
【发布时间】:2017-02-15 07:29:50
【问题描述】:

我在PHP docs comments 中发现了这条非常古老的评论,但我不明白为什么它在第一个示例中输出“hihaha”而不是“eita”。 $a 已更改,我假设 "hihaha" 已永久删除。如果不是,那为什么如果更改为null 或分配另一个变量的副本,那么"hihaha" 将被永久删除?

// 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"

这是解决循环引用问题的“好方法”吗?

【问题讨论】:

  • 因为您已复制参考。因为你踩到了原来的物体。

标签: php reference pass-by-reference


【解决方案1】:

$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 设置为 null 时,$a$b 仍然指向相同的内容,因此 $b 现在也引用了 null。视觉上:

【讨论】:

  • 无法击败 mspaint 的解释!
【解决方案2】:

将变量视为指向引用 - 分解示例 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

我们现在知道echoing $b 会输出R1


希望有帮助!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多