这几天在看codeigniter的代码,其中有段代码不是很理解: $system_folder = "system";
        $application_folder = "application";
        if (strpos($system_folder, '/') === FALSE)
         {
      if (function_exists('realpath') AND @realpath(dirname(__FILE__)) !== FALSE)//====就这一块====
                  {
      $system_folder = realpath(dirname(__FILE__)).'/'.$system_folder;
           }
          }
         else
          {
      // Swap directory separators to Unix style for consistency
      $system_folder = str_replace("\\", "/", $system_folder); 
           }我觉得__FILE__已经可以返回文件的绝对路径,然后再用dirname()去除文件名就可以了,根本就没必要再加个realpath()
可是我想编这代码的人比我牛多了,肯定不会放低级错误,应该是realpath()还有什么别的作用,在这想问问大家,谢谢了

解决方案 »

  1.   

    <?php
    $path = "/etc/passwd";
    $file = dirname($path); // $file is set to "/etc"
    ?> 
    <?php
    //before PHP 4.3.0
    dirname('c:/'); // returned '.'
    //after PHP 4.3.0
    dirname('c:/'); // returns 'c:'
    ?> <?php
    chdir('/var/www/');
    echo realpath('./../../etc/passwd');// /etc/passwd
    ?> 
    是不是因为.的问题?
      

  2.   

    手册上写在4.0以前__FILE__会返回相对路径(有时)
      

  3.   

    realpath() 扩展所有的符号连接并且处理输入的 path 中的 '/./', '/../' 以及多余的 '/' 并返回规范化后的绝对路径名。返回的路径中没有符号连接,'/./' 或 '/../' 成分。 realpath() 失败时返回 FALSE,比如说文件不存在的话。在 BSD 系统上,如果仅仅是 path 不存在的话,PHP 并不会像其它系统那样返回 FALSE。手册上的
      

  4.   

    这个我有点了解,我当时在网上看到了这样一段描写:
     dirname(__FILE__) 也可能返回一个 . (当前目录)    [原因是 b.php 文件在 http.conf 或者 PHP 配置开发环境的默认WEB目录下
    可是我不知道这返回的 . ,realpath()会如何处理,现在尝试中》。
      

  5.   


    <?php var_dump(__FILE__);
    var_dump(dirname(__FILE__));
    var_dump(realpath(dirname(__FILE__)));
    var_dump(dirname('C:\\'));
    var_dump(dirname("C:/"));
    var_dump(realpath(dirname("C:\\")));
    var_dump(realpath(dirname("C:/")));
    ?>
    <?php
    //before PHP 4.3.0
    dirname('c:/'); // returned '.'
    //after PHP 4.3.0
    dirname('c:/'); // returns 'c:'
    ?>  这是我刚刚用来测试的代码
    结果是:
    string(11) "F:\test.php"
    string(3) "F:\"
    string(3) "F:\"
    string(3) "C:\"
    string(3) "C:\"
    string(3) "C:\"
    string(3) "C:\"没有想要的效果,那个 . 始终没有出现.....