我已经编写了这段代码来测试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如何用这种对象处理内存吗?
提前感谢。
答案 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/