0

我编写了这段代码来测试 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>$string>$objref>$objcopy

不应该是: $class=$objcopy>$string>$objref 吗?

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

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

提前致谢。

4

2 回答 2

1

你的观察基于错误的假设。

首先, your$objcopy是对与 相同的实例的引用,因为将实例分配给另一个变量时$class不会克隆它们。检查手册或将其添加到您的代码中:

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

其次,即使赋值运算符可以有效地使它们指向不同的对象,PHP 也可能不会分配新内存,因为它使用了写时复制优化,请参阅http://php.net/manual/en/internals2.variables。介绍.php

最后,你不能指望 PHP 返回精确的内存信息。它可能会分配比当前语句需要的更多的内存,并且可能会被垃圾收集器隐式释放内存。(好吧,至少你可以把它关掉。)

于 2013-10-10T14:09:26.410 回答
0

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

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

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

于 2013-10-11T10:30:55.483 回答