我已经搜索到互联网的末端以获得答案,我即将得出合乎逻辑的结论,即这是不可能的。当包含在不同目录/级别中具有依赖于其他多个文件的文件时,人们究竟如何使用相对根?
作为一个例子,这是我网站的简化树:
Main site (PHP reports the main root to be: /Users/Luke/Sites/)
-> index.php
-> directoryfolder - > secondaryindex.php
-> templates -> header.php
-> navigation.php
即。如果要在Finder中导航到index.php,他们会将目录看作/Users/Luke/Sites/SiteAlpha/index.php。
index.php& directoryfolder / secondaryindex.php包含header.php,然后包含navigation.php。问题似乎是,无论我在header.php上命名navigation.php的包含位置,它都只允许一个页面正确显示它。即:
如果在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被不同目录级别的多个页面调用,所以包含到navigation.php必须同时是我的第一个例子和我的第二个例子。
我尝试使用$ _SERVER ['DOCUMENT_ROOT'],dirname(__DIR__
),__FILE__
,我自己定义的根常量,但没有成功。我阅读,阅读和阅读无数文章和SO问题没有帮助。它只是不起作用。
有人可以给我一个关于我需要做些什么才能让它工作的ELI5解释吗?谢谢。
答案 0 :(得分:1)
首先,我确信应用程序应该只有一个入口点。根据您的情况,如果设置了特定参数,则可以在index.php中包含secondayrindex.php。与模板类似的情况:构建一个包含navigation.php和header.php的模板。然后,您必须只包含单个模板。或者使用像smarty这样的模板引擎,为你做了很多工作(躲避请不要打我,模板引擎讨厌)
回到你的案子。我看到了一些可能的解决方案:
define('APP_ROOT', __DIR__)
define('APP_ROOT', dirname(__DIR__))
require('navigation.php')
require('templates' . DIRECTORY_SEPARATOR . 'header.php')
require('..' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'header.php')
顺便说一下:
想想这样做:define('DS', DIRECTORY_SEPARATOR)
- 写DIRECTORY_SEPARATOR
会让你发疯。
我目前正处于使用绝对路径的阶段,只是在入口点定义根目录常量或包含在定义所有必要常量的入口点的文件。
希望这可以提供帮助。