Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用magic\uuu集的PHP内存泄漏_Php_Oop - Fatal编程技术网

使用magic\uuu集的PHP内存泄漏

使用magic\uuu集的PHP内存泄漏,php,oop,Php,Oop,我最近开始优化我的收集类,我发现一个内存泄漏。代码示例: class anObject {} $array = array(); for ($i=0; $i < 5000; $i++) { $obj = new anObject(); for ($j = 0; $j <5; $j++) { $obj->{'test'.$j} = $j; } $array[] = $obj; } echo memory_get_usage();

我最近开始优化我的收集类,我发现一个内存泄漏。代码示例:

class anObject {}

$array = array();
for ($i=0; $i < 5000; $i++) {
    $obj = new anObject();
    for ($j = 0; $j <5; $j++) {
        $obj->{'test'.$j} = $j;
    }
    $array[] = $obj;
}

echo memory_get_usage();
// 3548328
unset($array);

class anObjetWithSetter {
    public function __set($key, $value) {
        $this->{$key} = $value;
    }
}

$array = array();
for($i=0; $i < 5000; $i++) {
    $obj = new anObjetWithSetter();
    for ($j = 0; $j <5; $j++) {
        $obj->{'test'.$j} = $j;
    }
    $array[] = $obj;
}

echo memory_get_usage();
// 5708440
类对象{}
$array=array();
对于($i=0;$i<5000;$i++){
$obj=新的对象();
对于($j=0;$j{'test'.$j}=$j;
}
$array[]=$obj;
}
回显存储器的使用情况();
// 3548328
未设置($数组);
类anObjetWithSetter{
公共函数集($key,$value){
$this->{$key}=$value;
}
}
$array=array();
对于($i=0;$i<5000;$i++){
$obj=新的anObjetWithSetter();
对于($j=0;$j{'test'.$j}=$j;
}
$array[]=$obj;
}
回显存储器的使用情况();
// 5708440

有人知道这个内存泄漏吗?

这不是内存泄漏。如果你用setter注释掉上面的所有内容,那么你只运行第二个循环就得到了相同的内存使用率。将
anObjectWithSetter
重命名为
anobjectwithonemoresymboltoreinmemory
)@bassxzero如果我评论setter,我有相同的类!为什么setter会使用更多的内存来获得相同的结果?@Narf我知道这是个笑话,但它不是消耗内存的符号!方法magic _set需要两倍的内存…太大了。我不明白why@YohannTilotti你问我PHP是如何实现的,我回答说我没有写它让我不知道。至少我知道,与不带函数的类相比,带函数的类需要更多的内存。但据我所知,PHP可以对没有主体的类进行一些特殊的优化。