2010-10-31 55 views
1

當我嘗試使用requirerequire_once時,如果所需的文件位於相同的子目錄中,但當它在其子目錄之外看到文件時,它將正常工作,它會產生致命錯誤。這是基本的文件樹的樣子:如何在其他目錄分支中需要文件?

* main.php 
+ login/ 
    * login.php 
+ includes/ 
    * session.php 

...所以基本上,如果我有main.php需要登錄/ login.php中,它的罰款,但如果我嘗試做目錄遍歷login.php中要求包括/ session.php文件,它失敗,從而導致錯誤:

PHP Fatal error: require_once(): Failed opening required [...]

這一概念的代碼將是:

require('login/login.php') #works fine (main.php) 
require('../includes/session.php') #quits (login.php) 

我已經使用$_SERVER('DOCUMENT_ROOT')試過,$_SERVER('SERVER_ADDR')dir(_FILE_)chdir(../)。我記得幾個月前我在解決這個問題時正在開發一個項目,這是一個遍歷文件路徑的簡單函數,但是我再也找不到它了。有任何想法嗎?

+0

「\'」用於內聯代碼。對於[代碼塊](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks),每行縮進一個額外的四個空格。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。 「\ *」,「 - 」或「+」可用於列表。檢查我的編輯,看看如何。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。 – outis 2011-09-26 23:31:18

+0

當您引用'$ _SERVER'變量時,是否使用函數表示法(括號)而不是數組索引(方括號)?如果是這樣,那可能是你無法讓他們工作的原因。 – outis 2011-09-26 23:35:50

回答

1

這不是遞歸,它只是普通的舊目錄遍歷。

從不使用include/require的相對路徑。你永遠不知道你的腳本從哪個目錄被調用,所以總有可能你會進入錯誤的工作目錄。這只是令人頭痛的食譜。

總是使用dirname(__FILE__)來獲取當前文件所在目錄的絕對路徑。如果你使用PHP 5.3,你可以只做__DIR__。 (注意兩個下劃線正面和背面。)

require dirname(__FILE__).'/../includes/session.php'; 

(順便說一句,你不需要的括號包括/需要,因爲它是一種語言結構,不是一個函數。)

使用絕對路徑可能也有更好的性能,因爲PHP不需要查看include_path中的每個目錄。 (但是這隻適用於在include_path中有多個目錄。)

+0

對不起,我在這個問題的同時正在處理遞歸,這只是一個令人頭疼的問題。 – Nik 2010-10-31 04:59:04

+0

相對路徑有其用途。 「永遠不要使用相對路徑」有點虛僞,因爲你用'dirname(__ FILE __)'來做同樣的事情(甚至是僞裝!)。 – cHao 2010-10-31 07:10:12

3

使用set_include_path(),它會讓你的生活更輕鬆。

+0

現在測試.... – Nik 2010-10-31 04:55:43

+0

工程。我只需要找到一種方法讓它根據目錄根目錄動態設置包含路徑。 – Nik 2010-10-31 05:19:12

+1

您將使用引導過程,您的第一個包含您的頁面應始終是您的bootstrap.php文件,它設置您的路徑。 – Scott 2010-10-31 05:20:54

相關問題