我有一个简单的对象事物,它能够拥有相同类型的孩子。
这个对象有一个 toHTML 方法,它执行如下操作:
$html = '<div>' . $this->name . '</div>';
$html .= '<ul>';
foreach($this->children as $child)
$html .= '<li>' . $child->toHTML() . '</li>';
$html .= '</ul>';
return $html;
问题是当对象很复杂时,比如很多有孩子的孩子等等,内存使用量会猛增。
如果我只是print_r
提供这个对象的多维数组,我会得到 1 MB 的内存使用量,但是在我将数组转换为我的对象并执行print $root->toHtml()
它之后需要 10 MB !
我怎样才能解决这个问题?
=====================================
制作了一个与我的真实代码相似的简单类(但更小):
class obj{
protected $name;
protected $children = array();
public function __construct($name){
$this->name = $name;
}
public static function build($name, $array = array()){
$obj = new self($name);
if(is_array($array)){
foreach($array as $k => $v)
$obj->addChild(self::build($k, $v));
}
return $obj;
}
public function addChild(self $child){
$this->children[] = $child;
}
public function toHTML(){
$html = '<div>' . $this->name . '</div>';
$html .= '<ul>';
foreach($this->children as $child)
$html .= '<li>' . $child->toHTML() . '</li>';
$html .= '</ul>';
return $html;
}
}
和测试:
$big = array_fill(0, 500, true);
$big[5] = array_fill(0, 200, $big);
print_r($big);
// memory_get_peak_usage() shows 0.61 MB
$root = obj::build('root', $big);
// memory_get_peak_usage() shows 18.5 MB wtf lol
print $root->toHTML();
// memory_get_peak_usage() shows 24.6 MB