【问题标题】:Do all references to a string literal refer to same instance?对字符串文字的所有引用都引用同一个实例吗?
【发布时间】: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函数!

标签: php string


【解决方案1】:

您指的是一个名为String interning 的概念。从 5.4 版开始,它似乎在 Zend 引擎中实现:“我们的实现使在编译时已知的字符串被实习。” Source.

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2019-04-22
    • 1970-01-01
    • 2019-03-15
    • 2012-11-03
    • 1970-01-01
    • 2014-09-15
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多