2013-02-20 106 views
0

我已經搜索了互聯網的末端以獲得有關此問題的答案,並且我將得出一個合理的結論,即它不可能。在包含一個文件時,如何在其他多個文件依賴於不同目錄/級別的情況下使用相對根?包含多個依賴關係的相關問題[PHP]

作爲一個例子,這裏是我的網站的簡化樹:

Main site (PHP reports the main root to be: /Users/Luke/Sites/) 
-> index.php 
-> directoryfolder - > secondaryindex.php 

-> templates -> header.php 
       -> navigation.php 

即如果有人在Fi​​nder中導航到index.php,他們會將目錄看作/Users/Luke/Sites/SiteAlpha/index.php。

這兩個index.php & directoryfolder/secondaryindex.php包括header.php,然後包括navigation.php。問題似乎是,無論我在header.php中包含navigation.php的包含位置,它只會允許一個頁面正確顯示它。 IE:

如果index.php中的navigation.php被調用(通過header.php),並且ROOT_PATH的包含位置爲'/ templates/navigation.php(其中ROOT_PATH等於dirname(__DIR__)),根本不會顯示。但它工作在secondaryindex.php。

反之亦然。如果index.php上的navigation.php被調用(通過header.php),並且包含位置爲ROOT_PATH。'/ siteAlpha/templates/navigation.php,它將實際上工作。但是,它不會在secondaryindex.php上工作。

TL; DR,由於header.php被不同目錄層上的多個頁面調用,導航.php的include必須同時是我的第一個例子和我的第二個例子。

我試過使用$ _SERVER ['DOCUMENT_ROOT'],dirname(__DIR__),__FILE__,我自己定義的根常量,沒有任何成功。我讀過並閱讀過無數的文章和SO問題,但沒有任何幫助。它只是不起作用。

有人可以關心給我一個ELI5解釋我需要做些什麼來讓它工作嗎?謝謝。

回答

1

首先,我確信應用程序應該只有一個入口點。根據您的情況,如果設置了特定參數,您可以在index.php中包含secondayrindex.php。與模板類似的情況:構建一個包含navigation.php和header.php的模板。那麼你只需要包含單個模板。或者使用像smarty這樣的模板引擎,它爲你做了很多工作(迴避請不要打我,模板引擎仇敵)

回到你的情況。我看到的可能解決方案的幾個給你:

  • 在入口點文件中定義您的應用程序的根目錄中的常數(如index.php文件 - 最有意義和我正好有一個條目的想法點)
    • 在index.php文件也可能是​​
    • 在secondaryindex.php它可能是define('APP_ROOT', dirname(__DIR__))
    • 當然,你必須意識到不包括的index.php和secondaryindex。PHP的同時
  • 僅使用相對路徑
    • 包括的header.php navigation.php將require('navigation.php')
    • 包含在index.php中的header.php將是require('templates' . DIRECTORY_SEPARATOR . 'header.php')
    • 包括報頭。 PHP在secondaryindex.php是require('..' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'header.php')

BTW: 想着這樣做:define('DS', DIRECTORY_SEPARATOR) - 寫作DIRECTORY_SEPARATOR會讓你瘋狂。

我目前只在使用絕對路徑的階段,而在入口點定義一個根目錄常量或包含在入口點定義所有必要的常量的文件。

希望這可以幫助。

+0

謝謝,我試過你的第一個想法,關於同一個常量的兩個定義,但它仍然行不通!奇怪的是,包含現在在index.php和secondaryindex.php上都有完全相同的路徑(/Users/Luke/Sites/siteAlpha/templates/navigation.php),如快速回顯所證實的,但實際上它只是實際出現並在index.php上運行!有任何想法嗎? – ReactingToAngularVues 2013-02-20 11:35:18

+0

你使用'include'還是'require'?在這兩種情況下,請將錯誤報告設置爲最大值 - 例如「error_reporting(E_ALL)」以驗證文件是否真的存在於腳本認爲它們的位置。我擁有的最後一個想法是您的包含腳本中可能存在的錯誤。也許某些參數檢查在secondaryindex.php的情況下失敗。我的水晶球今天有點霧,如果你知道我的意思;) – Joshua 2013-02-20 13:31:14

+0

感謝您的回答...我最終得到它使用您的方法在每個入口點定義一個常數!它最初並沒有工作,因爲我忘記了將一個特定的include包含在常量中......現在全部修復了。乾杯。 – ReactingToAngularVues 2013-02-21 08:38:36