欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

php中使用include(require)嵌套包含文件时的一些注意问题

/**
 * Author:RDP
 * My mail:abel1314520@gmail.com
 * My blog:  http://blog.teamhaka.com

 */

 

注:以下说明都适用于include、include_once、require、require_once。

例子基本上都是a.PHP包含b.php,b.php中包含c.php这样的嵌套包含形式。主要讨论的是a.php和c.php之间的结构关系。其中a.php为入口文件。

 

包含文件时的路径其实有三种选择。

分别是

一 绝对路径                                      例:/aaa/bbb/ccc/c.php

二 相对路径(当前目录使用./)           例:./ccc/c.php

三 相对路径(当前目录不使用./)       例:ccc/c.php

关于两个相对路径,可以直观的注意上述(二)和(三)相对路径的不同点。有没有./在嵌套包含文件的时候,会有很大的不同!后文具体说明。

 

一 使用绝对路径的注意点:

直接写绝对路径没有什么好注意的,但是在使用dirname(__FILE__)来获取当前文件的绝对路径时,要注意无论写这条语句的php文件是否被其他文件所包含,dirname(__FILE__)都总是指向写这条语句的php文件所在的绝对路径

例:  

作为入口文件的a.php: require './b/b.php';

b.php:require dirname(__FILE__).'/c.php';

那么在执行a.php时,b.php中的dirname(__FILE__)得到的是b.php所在的绝对路径,而不是a.php所在的绝对路径。(在此例中意味着b.php和c.php是同属于b目录下的)

 

二 使用相对路径(当前目录使用./)的注意点:

相对路径是以某个目录为基准来确定需要包含的文件所在的位置。相对路径的基准目录就是程序执行的入口文件所在的目录,不管包含嵌套多少层。

例:  

作为入口文件的a.php: require './b/b.php';

b.php: require './c/c.php';  //请注意这里包含c目录时使用的是./  

那么,注意这里的c.php所在的c目录和b目录是同级的,而并非是c目录在b目录的下面。因为b.php中的包含使用了相对路径,而程序入口是a.php,所以b.php包含使用的相对路径应是以入口文件a.php所在目录来作为基准的。

 

三 使用相对路径(当前目录不使用./)的注意点:

分两步处理,首先以程序入口文件所在目录为基准沿相对路径来寻找,找到存在的文件则包含成功退出(和上述的【相对路径(当前目录使用./)】一样)。如果找不到,则走第二步处理。即在写require语句的php文件所在目录来和require中包含的路径进行拼接,还是以入口文件所在目录为基准,沿这个拼接得到的相对路径来搜寻,文件存在则包含成功,否则表示被包含文件不存在。看例子理解比较容易。

例:  

作为入口文件的a.php: require './b/b.php';

b.php: require 'c/c.php';  //请注意这里包含c目录时没有使用./  

那么,首先会在入口文件a.php所在的目录下搜寻c/c.php,如果有,则包含成功。

如果没找到,接下来就将b.php的所在路径(./b/b.php)和b.php中require的路径(c/c.php)进行拼接,得到拼接后的相对路径./b/c/c.php。在入口文件a.php所在的目录下搜寻./b/c/c.php,存在就包含成功,否则即出错。

 

/*******************分割线***********************/

稍微总结下相对路径的嵌套包含。

相对路径的嵌套包含,都是以程序入口文件所在目录为基准来沿相对路径来搜寻需要包含的文件的。

但是如果在相对路径中使用到了当前目录这个概念时,就会有差异。即,使不使用./来表示当前目录,所带来的处理是不一样的。

有./就是以入口文件所在目录为基准来直接搜寻,

没有./,则先以入口文件所在目录为基准来搜寻,找不到的情况下做路径的拼接处理,然后按拼接后的相对路径来搜寻,基准依然是入口文件所在目录。

综合下使用./和不使用./的一个例子

文件结构如下:

/WEBROOT

——–test.php

——–/folder2/test2.php

——–/folder2/folder3/test3.php

作为程序入口的test.php包含test2.php,而test2.php中包含了test3.php。

那么在test2.php中的包含路径的写法有如下差异:

[php] view plain copy
 
 
  1. require ('folder2/folder3/test3.php'); //正确! 直接在入口程test.php所在的WEBROOT目录下搜寻folder2/folder3/test3.php  参考上述的【三 使用相对路径(当前目录不使用./)的注意点】  

[php] view plain copy
 
 
  1. require ('folder3/test3.php');  //正确! 拼接相对路径然后搜寻  参考上述的【三 使用相对路径(当前目录不使用./)的注意点】  

[php] view plain copy
 
 
  1. require ('./folder2/folder3/test3.php');  //正确!  参考上述的【二 使用相对路径(当前目录使用./)的注意点】  

[php] view plain copy
 
 
  1. require ('./test3/test3.php');    //错误!入口程序test.php所在的WEBROOT目录下并不存在test3这个目录!参考上述的【二 使用相对路径(当前目录使用./)的注意点】  
 

普通分类: