【发布时间】:2013-09-13 20:40:34
【问题描述】:
我的一个同事发了一个帖子,说这样的话:
在 PHP 中,如果有两个变量引用同一个值,那么它们就是同一个实例。
$a="Mary";
$b="Mary";
$c="lamb"
他暗示 $a 和 $b 指的是同一个实例(内存空间)。我很难相信这一点。我知道这在 java 中有点正确,但我认为对于 php 来说并非如此,因为在 php 中,字符串在原则上实际上并不是不可变的,拥有一个实例是没有意义的
此外,他说,如果我们这样做 unset($a) 它只会删除 $a 的引用而不是实际值。
这当然是对的,但什么也证明不了
我还尝试了以下代码并打印了 $a 和 $b。如果他们共享同一个实例,那么 $b 的值也会发生变化。
$a[2]=3;
echo "<br/>\$a: $a<br/>"; //He3lo
echo "<br/>\$b: $b<br/>";//Hello
我很想检查变量的内存空间,但我认为 php 不允许这样做。有人可以澄清这是否属实
【问题讨论】:
-
简单测试:创建一个长字符串文字并测量内存消耗。然后对两个相同的长字符串文字执行相同的操作。即使 PHP 在内部优化了内存存储,它在任何方面的行为都不像在用户空间代码中那样。
-
测量它,测试它。这是最好的方法。然而,答案是 not - 因为 PHP 使用写时复制内存管理方法。
-
我还尝试了以下代码并打印了
$a和$b。如果它们共享同一个实例,$b的值也会改变。 不,因为 PHP 确实会在写入时复制。如果您尝试$a = "Mary"; $b = $a;,您将得到相同的结果,即使这一次它们共享同一个实例。 Here's an example. -
你也可以使用
debug_zval_dump函数!