php中使用include(require)嵌套包含文件時的一些注意問題

/**
 * Author:RDP
 * My mail:[email protected]
 * 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這個目錄!參考上述的【二 使用相對路徑(當前目錄使用./)的注意點】  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章