分享

PHP 相对目录问题 | William Sang

 yliu277 2015-11-19

在PHP中处理目录包含的时候有时候会遇到一些意想不到的情况,如下面的例子: 目录结构: 相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 目录1下的a.php代码
<?php     
    header("Content-Type:text/html;charset=UTF-8");
    require_once'../b.php';    
    echo "这里是a";
?>
//php_test根目录下的b.php代码,想调用和他同目录的c.php
<?php    
    require_once'c.php';
    echo "这里是a上一级的b";
?>
//php_test根目录下的c.php代码
<?php    
    echo "这里是和b同一目录的c";
?>
//目录1下的c.php代码
<?php
    echo '这是和a同目录的c'
?>
//结果如下
这是和a同目录的c
这里是a上一级的b
这里是a

在b.php中我们明明是调用的和b同目录的c.php,但是结果竟然是调用的和a.php同目录的c.php。这是为什么呢。 原来php中相对路径是以当前工作目录为基准的,并非以当前处理文件目录为基准。这里的工作目录就是指,最开始调用的文件目录,当前目录指执行到的文件。 为了防止和我们的预期产生偏差,我们可以采用指定相对目录的方法。 这里介绍一个函数:

string dirname(string path)

给出一个包含有文件全路径的字符串,返回一个去掉文件名的目录名。 (注意以下两种结果最后面有没有目录分隔符)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//先将一个文件dirname.php
<?php   
    header("Content-Type:text/html;charset=UTF-8");
    $path = '/data/www/index.php';
    echo dirname($path);
    echo '';
    echo dirname('c:/a/b.php');
    echo '';
    echo dirname('c:/');
 ?>
//结果如下
/data/www
c:/a
c:\

以上结果不得不提一下,Windows和类UNIX系统中目录分隔符的使用,类UNIX系统的目录分隔符统一使用/,而Windows系统中/和\都可以。为了提高可移植性,我们最好统一采用/作为分隔符,PHP也有一个自适应常数DIRECTORY_SEPARATOR来代替目录分隔符,但是个人觉得太长比较麻烦哈。 好了,下面我们来更改a.php和b.php中引入文件部分的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//目录1下的a.php代码
<?php    
    header("Content-Type:text/html;charset=UTF-8");    
    require_once dirname(__file__).'/../b.php';    
    echo "这里是a";
?>
//php_test根目录下的b.php代码
<?php    
    require_once dirname(__file__).'/c.php';    
    echo "这里是a上一级的b";
?>
//php_test根目录下的c.php代码
<?php    
    echo "这里是和b同一目录的c"
?>
//结果如下
这里是和b同一目录的c
这里是a上一级的b
这里是a

这下就是我们所要的结果啦!

注意:

关注一下文件名前的目录分隔符!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多