PHP类和var内存大小混乱

时间:2013-10-10 11:42:44

标签: php memory size

我已经编写了这段代码来测试PHP中某些对象的大小

<?php
class MyClass
{
    public $string1="first string";
    public $string2="second string";
    public $string3="third string";

    public function __toString() {
        return $this->string;
    }
}

function mem() {
    return memory_get_usage(false);
}


$before = mem();
$class = new MyClass;
var_dump("new object size: ".(mem() -$before));

$before=mem();
$string = "test";
var_dump("string size: ".(mem() -$before));

$before=mem();
$objcopy = $class;
var_dump("object copy size: ".(mem() -$before));

$before=mem();
$objref = &$class;
var_dump("object reference size: ".(mem() -$before));

这是我系统中的输出:

string(20) "new object size: 188"
string(15) "string size: 80"
string(20) "object copy size: 44"
string(25) "object reference size: 72"

我现在很困惑,为什么我们有:$ class&gt; $ string&gt; $ objref&gt; $ objcopy

不应该是:$ class = $ objcopy&gt; $ string&gt; $ objref?

$ objcopy实际上包含3个字符串,而$ string是单个字符串..

有人可以解释一下php如何用这种对象处理内存吗?

提前感谢。

2 个答案:

答案 0 :(得分:1)

您根据错误的假设进行观察。

首先,您的$objcopy是与$class相同的实例的引用,因为在将实例分配给另一个变量时,实例不是cloned。检查the manual或将其添加到您的代码中:

$objcopy->string1 = 'a';
echo $class->string1, "\n";

其次,即使赋值运算符有效地使它们指向不同的对象,PHP也可能不会分配新内存,因为它使用copy-on-write optimization,请参阅http://php.net/manual/en/internals2.variables.intro.php

最后,您不能期望PHP返回精确的内存信息。它可以分配超过当前语句所需的内容,并且可以通过垃圾收集器隐式释放内存。 (好吧,至少你可以turn that off。)

答案 1 :(得分:0)

是的,我的问题是基于C ++和其他语言参考观点所衍生的错误知识。

所以,经过长时间的研究,我在我的博客上创建了一篇关于这个论点的帖子,我将深入解释php如何处理内存。

http://hyperweb2.com/home/blog/2013/10/11/php-reference-vs-copy-vs-clone/