2013-02-20 45 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