2016-10-15 49 views
-1

我正在開發一個PHP網站,在Mac OS上使用Eclipse。PHP如何處理我的項目中包含文件和相對路徑

我想知道什麼是處理包含句子的正確方法。

我有一個php文件,這是我的主'lib'腳本。該文件通過包含命令訪問其他文件。問題在於如何引用此子文件,因爲include中的相對路徑基於入口點腳本,而不是當前腳本。

因此,讓我們說我有一個mainlib.php文件,該文件訪問sublib.php文件。這將是類似的東西:

 
Project Root: 
    [libs] 
     mainlib.php 
     sublib.php 
    [subdir] 
     entryPointB.php 
    entrypointA.php 

我想提出的包括「sublib.php」一句mainlib.php,所以我只能包括mainlib.php,而不是既包括每次我需要它。 (在這個例子是隻有兩個文件,但是在我的實際項目中會有更多的文件

比方說我mainlib.php文件包含此:

<?php include "libs/sublib.php; ?> 

它將工作時mainlib.php被稱爲從entryPointA.php,但如果從EntryPointB稱爲如果mainlib.php包含失敗

<?php include "../libs/sublib.php; ?> 

它將工作在EntryPointB.php,但在entrypointA.php失敗。

我該如何解決這個問題?

一些可能我試過或想過:

  • 使用絕對路徑 - 那倒是一個很好的解決辦法,因爲我將不得不更改文件每次我上傳到生產。
  • prepend $ _SERVER ['DOCUMENT_ROOT']包含路徑 - 在Mac上它返回/ Library/WebServer/Documents,但我的網站位於UserFolder/Sites/MySiteName中。
  • __DIR__獲取目錄變量 - 不起作用,因爲它返回入口點文件,而不是項目根目錄。
  • 全局配置 - 我想將硬編碼根路徑放入全局變量中。這個想法是在全局腳本中定義這個變量,而在生產中我只需要更新這個腳本。但它仍然是同樣的問題,我如何參考這個腳本而不會遇到路徑問題?
+1

使用['__DIR__'(http://php.net/manual/en/language.constants.predefined.php)和['目錄名()'](http://php.net/manual/en/function.dirname.php)從相對路徑建立絕對路徑。 – axiac

+0

這就是爲什麼有這樣的概念,如環境配置(也vagrant /碼頭等),所以你可以處理這些差異(或在虛擬化的情況下,只是沒有他們)。 –

+0

您是否檢查過這個'<?php include「/libs/sublib.php;?>?? –

回答

0

我解決了這個問題。不知道這是不是最好的方法,但它解決了我。如果有人遇到同樣的問題,我會把它留在這裏。

我創建了一個叫做config.php文件,包含以下內容:

<?php define("ROOT_PATH", "/Path/to/My/Project/"); ?> 

然後,我mainLib.php我能有這樣的一句話:

include "config.php"; 

它將工作的地方入口點腳本位於,因爲它總是指向當前文件的相同目錄,而不是入口點。然後我心底只需要添加ROOT_PATH到其他包括:

inclue ROOT_PATH."/subdir/file.php"; 
+1

評論中有很多有用的提示比這更好。 – DanFromGermany

相關問題