什么是在PHP中在不同目录中声明require'd元素的正确方法?

时间:2011-03-25 15:19:09

标签: php

我在我的网站上使用了几个'require()'语句。在其中一些require语句中,放置了额外的“require”元素。然而,我有时会遇到的问题是,第一个要求的目录可能与第二个要求不同,从而导致网站查找错误的位置。

例如:

假设站点结构有2个主文件夹:X和Y.在Y中是一个名为Z的子文件夹。

文件夹X中的一个文件,名为page.php,它使用一个名为'function.php'的文件的require语句。然而,Function.php在Z中使用了另一个名为'constants.php'的require语句。

page.php(在X中)看起来像:

  

要求( '../ Y / function.php');

和function.php(在Y中)看起来像:

  

要求( 'Z / constants.php');

我面临的问题是,当X本质上试图调用Z的常量文件时,它将其视为文件夹Z放在其自己的子目录中。

即。 page.php使2需要调用require('../ Y / function.php');并要求('Z / constants.php'); < - 不存在。

我知道我可以使用绝对路径,但我不断在Windows和Linux环境之间切换,这将是一个巨大的PITA在两种格式之间来回传递。

有什么建议吗?

修改

最奇怪的是,有时上述问题有效。我无法弄清楚为什么还没有,但似乎问题可能实际上是在目录中前进可以自动修正但是倒退(即在一个文件夹中处于第3级并跳回导致问题)

4 个答案:

答案 0 :(得分:1)

你将需要绝对路径(不幸的是)我建议定义类似这样的东西

define('DOCUMENT_ROOT', dirname(realpath(__FILE__)).'/');

因此,如果有必要,您可以随时更改它,以便更容易记住和输入。

答案 1 :(得分:1)

您可以考虑使用set_include_path(get_include_path().";path\to\root");来定义公共包含路径。然后,您可以使用include('Y/file.php')include('Z/otherfile.php');

您可以在基本文件中设置此文件,该文件在执行任何其他代码之前始终先执行。

编辑:就“正确”方式而言,如果您使用OOP原则进行编程,那么您应该考虑使用某种类型的自动加载器。这样,您就可以为类提供明确的命名原则,以及您不必使用requireinclude命令来丢弃代码。请特别注意SplClassLoaderhttps://gist.github.com/221634或者,看看自己构建自己:http://php.net/manual/en/language.oop5.autoload.php

答案 2 :(得分:1)

另一个选择是使用$_SERVER['DOCUMENT_ROOT']而不是定义自己的。{/ p>

答案 3 :(得分:1)

假设您有以下文件夹结构:

MainDir/X/...

MainDir/Y/...

MainDir/Z/...

这意味着您在常见的MainDir文件夹中有X,Y和Z文件夹

在某处定义BackPath ...让我们说在X文件夹中:

$Backpath = ../../

这将带你回到你的MainDir

然后在php文件中

require($Backpath.'Y/function.php');

require($Backpath.'Z/constants.php');