做了一个统计目录的函数,最后使用return $size和换成echo $size的结果为何不同,使用return可以取得正确的结果,而如果换成直接输出则不行,求解
function bDir($dirPath){
$size=0;
$dir_handle=opendir($dirPath);
while($file=readdir($dir_handle)){
//echo $file."<br/>";
if($file!=".." and $file!=".") {
$filePath = $dirPath."/".$file;
if(is_file($filePath)){
// echo $file.'<br>';
$size += filesize($filePath);
}else{
$size += bDir($filePath);
}
} }
return $size;
//echo $size;
}
$path="C:/AppServ/www/cms_demo";
$str=bDir($path);
function bDir($dirPath){
$size=0;
$dir_handle=opendir($dirPath);
while($file=readdir($dir_handle)){
//echo $file."<br/>";
if($file!=".." and $file!=".") {
$filePath = $dirPath."/".$file;
if(is_file($filePath)){
// echo $file.'<br>';
$size += filesize($filePath);
}else{
$size += bDir($filePath);
}
} }
return $size;
//echo $size;
}
$path="C:/AppServ/www/cms_demo";
$str=bDir($path);
return 是函数的返回值,调用此函数后,要求返回的值就用return,你就把return当成是另一个调用函数就好理解了
echo 只是单纯的输出 一个变量的值而已,没有函数调用功能
return $size;
$size += bDir($filePath); 就会出问题。
当函数被调用的时候,如果出现递归调用,那么当前的$size值被压入数据堆栈.开辟数据空间去执行递归调用.重新执行函数.
为了便于理解.我们把它说为bDir2()//bDir2和bDir是一模一样的函数.;
再次执行递归调用的时候bDir2里面的$size又被压入数据堆栈.然后接着去执行bDir3();依次类推.
当最后的bDirN执行得到返回值后.不需要再调用其他函数.那么从bDir(n-1)开始弹出堆栈.依次计算值.最后返回.这个过程中,最开始的bDir()没有执行到return 而是执行到else的时候就开始等到数据,等到数据全部返回后.它才去执行了return;
而echo是输出语句,当bDir被调用的时候.那么$size就被重置为0.就是说echo应该输出的数值是你最后依次bDir被调用的时候或者说你最后一个目录里面的值.
可以去看看变量的作用域.研究下数据结构和编译原理什么的.上面应该有写.希望我的解释你能够理解.可能说的有点绕,不过我能想到的.就这些了.用文字表达,确实费劲.
这里有个变量$str 所以函数内必须returnbDir($path);
这里没有变量 所以结果可直接输出