我想问你,在PHP中如果我在一个函数中创建了一个新类,那么在函数的最后会释放内存吗?
例如:Class
class config
{
var $mapProp = array("x"=>4333, "y"=>3520, "w"=>128, "h"=>128);
var $gameProp = array("maxLevel"=>14, "tilesSize"=>256);
var $mapUrl = 'map_files';
function getMapProp()
{
return $this->mapProp;
}
function getGameProp()
{
return $this->gameProp;
}
function getMapUrl()
{
return $this->mapUrl;
}
}
$config = new config();
和功能
class framework
{
function getUserMap()
{
require("class/config/config.php");
require("class/imageManipulation/image.php");
$mapUrl = $config->getMapUrl();
$x = $_GET['x'];
$y = $_GET['y'];
$level = $_GET['level'];
$main_img = $mapUrl.'/'.$level.'/'.$x.'_'.$y.'.jpg';
//Create a new class
$image = new imageManipulation();
//Set Up variables
$image->setProp($config->getMapProp());
$image->setGameProp($config->getGameProp());
return $image->getImage($main_img, $level, $x, $y);
}
}
$framework = new framework();
require("class/framework/framework.php");
$path = $_GET['path'];
switch ($path) {
case 'usermap':
$framework->getUserMap();
break;
}
在getUserMap中的我使用了两个类。其中一个是$ config类,另一个是$ image类,在函数结束后会释放用于这两个类的内存吗?
一切顺利, 罗伯特。
答案 0 :(得分:2)
是的。局部变量在函数调用结束时放置。如果其中一个局部变量是一个对象,则不再引用它。因此它将被垃圾收集器释放。
答案 1 :(得分:2)
对您的确切案例进行测试以找出:
<?php
class bar
{
public function __construct()
{
$this->data = str_repeat('x', 10000000);
}
}
function foo()
{
$b = new bar();
echo memory_get_usage()."\n";
}
echo memory_get_usage()."\n";
foo();
echo memory_get_usage()."\n";
?>
我明白了:
这表明它确实如此。
显然,这里没有任何内容引用该数据,因此PHP可以释放它。
答案 2 :(得分:0)
首先,我认为你应该用“在函数末尾”准确描述你的意思,你的意思是在函数调用结束时,还是......?
PHP将函数作为构造存储在内存中,如果你愿意,不执行代码,那么当根据函数实际执行的函数执行函数时,就会分配内存。
例如,如果我有以下功能:
function test()
{
$data = array();
for($i = 0; $i < 10000; $i++)
{
$data[] = array('one','two','three','four','five','six',);
}
}
调用该函数并为该数组创建对内存的引用,每次迭代循环时,内存都会增加。
然后函数结束但是如果你注意到数据没有返回,那是因为局部变量只适用于当前作用域,因为它将不再使用,垃圾收集器会清除内存。 / p>
所以是的,它会在函数调用结束时清除已分配的内存。
一点提示(不适用于PHP 5中的对象)。
您可以通过引用传递数据,这样您只需修改相同的已分配内存,而不管函数是什么,
例如:
/*
Allocate the string into the memory into
*/
$data = str_repeat("a",5000);
function minip(&$data)
{
$_data &= $data;
$_data = '';
}
我将点传递给$data
到一个新变量,它只指向旧变量,这样你就可以传递数据,而不会让垃圾收集器使用更多的资源。