做了一个统计目录的函数,最后使用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);

解决方案 »

  1.   

    毫无疑问啊!return 和 echo 的结果不同啊!
    return 是函数的返回值,调用此函数后,要求返回的值就用return,你就把return当成是另一个调用函数就好理解了 
    echo 只是单纯的输出 一个变量的值而已,没有函数调用功能
      

  2.   

    但是我的$size是做了累加的啊,即使只是输出一个值,也应该是累加的值啊,那样结果应该也没错啊,继续求解
      

  3.   

    echo $size;
    return $size;
      

  4.   

    这样更不行啦,效果也没区别啦,我就是想知道为何直接输出值怎么会不一样,如果是直接输出值就会的到一连串的的数值,也就是没有达到$size累加后的结果,而如果把$size做成返回则可以得到正确的统计目录结果我就是不明白这个
      

  5.   

    呃~~楼主用的是递归函数,如果函数没有return,只有echo,
    $size += bDir($filePath);  就会出问题。
      

  6.   

    可能说的有些纰漏,不过大概应该是这个样子.
    当函数被调用的时候,如果出现递归调用,那么当前的$size值被压入数据堆栈.开辟数据空间去执行递归调用.重新执行函数.
    为了便于理解.我们把它说为bDir2()//bDir2和bDir是一模一样的函数.;
    再次执行递归调用的时候bDir2里面的$size又被压入数据堆栈.然后接着去执行bDir3();依次类推.
    当最后的bDirN执行得到返回值后.不需要再调用其他函数.那么从bDir(n-1)开始弹出堆栈.依次计算值.最后返回.这个过程中,最开始的bDir()没有执行到return 而是执行到else的时候就开始等到数据,等到数据全部返回后.它才去执行了return;
    而echo是输出语句,当bDir被调用的时候.那么$size就被重置为0.就是说echo应该输出的数值是你最后依次bDir被调用的时候或者说你最后一个目录里面的值.
    可以去看看变量的作用域.研究下数据结构和编译原理什么的.上面应该有写.希望我的解释你能够理解.可能说的有点绕,不过我能想到的.就这些了.用文字表达,确实费劲.
      

  7.   

    $str=bDir($path);
    这里有个变量$str 所以函数内必须returnbDir($path);
    这里没有变量 所以结果可直接输出