如何消除冗长的相对包含路径


How to eliminate lengthy relative include paths

有没有一种常用的方法可以指定网站/应用程序的根文件夹,而不必使用这样的代码:

require '../../../../config/settings.php';

我以前使用过各种方法,目前我正在考虑的方法是在主机上设置一个环境变量,这样我就可以做这样的事情:

require getenv('PROJECT_ROOT') . '/config/settings.php';

但这实际上只适用于有一个项目的系统,而且还有其他各种缺点,所以我想知道是否有更好的方法?

如果您想沿着环境变量路径走下去,您可以从Apache vhost设置环境变量。请查看Apache文档中的SetEnv和SetEnvIf。例如,为给定apache vhost:的所有传入请求提供环境变量

SetEnv PROJECT_ROOT='/path/to/my/project'

例如,根据主机名更改环境变量的值:

SetEnvIf Host www.example.com PROJECT_ROOT='/path/to/example/com'
SetEnvIf Host www.example.org PROJECT_ROOT='/path/to/example/org'

其他选项包括自动加载和引导。自动加载适用于类,但不适用于像您的示例这样的配置文件。一个好的命名约定(如PSR-0)将使类名到文件名的映射更加容易。引导包括创建一个文件,该文件包含在所有脚本中,然后加载配置设置等内容。引导程序是设置自动加载的好地方。这样,你的引导程序在加载应用程序的其余部分之前加载配置,你只需要假设它存在于应用程序的其他地方。

也许您可以使用以下脚本:

$_SERVER['DOCUMENT_ROOT'];
$currentDirectory = array_pop(explode("/", getcwd()));

但也比这更好的是,你可以参考这个问题:我如何才能得到"应用根";我的URL从PHP?

您可能希望使用引导程序来加载所需的必要文件,以便后续文件只需要引导程序文件。

在不知道代码是如何组织的情况下,我会说研究一下PHP的自动加载功能。(http://php.net/manual/en/language.oop5.autoload.php)只要遵循正确的约定,就可以通过编程将类名映射到加载它的路径。或者遍历目录树,直到找到匹配项。