2013-10-10 72 views
0

我寫這個代碼來測試一些物體的大小,PHPPHP類和VAR內存大小混淆

<?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串內,而不是$的字符串是單個的..

有人能解釋我如何PHP處理內存與這種類型的對象?

在此先感謝。

+0

這些內存測量是否在多次運行中保持不變? – Halcyon

+0

是的,我嘗試了不同的時間 – Joseph

+0

嘗試'memory_get_usage(true)',根據手冊將「獲得從系統分配的實際內存大小」。 –

回答

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。)