【发布时间】:2010-11-13 21:45:49
【问题描述】:
好的,我正在为我的自定义博客在 url /admin 创建一个管理界面。
我是否可以使用与根目录相同的包含(包括自动加载)。
如果可能,我还希望能够自动更正导航中的链接,以便当从 /admin 访问时,它们会将 / 中的 index.php 更改为 ../index.php。
谢谢,尼科
【问题讨论】:
好的,我正在为我的自定义博客在 url /admin 创建一个管理界面。
我是否可以使用与根目录相同的包含(包括自动加载)。
如果可能,我还希望能够自动更正导航中的链接,以便当从 /admin 访问时,它们会将 / 中的 index.php 更改为 ../index.php。
谢谢,尼科
【问题讨论】:
对此的最佳做法是定义一个“ABSOLUTE_PATH”常量,其中包含所有内容所在的目录。之后,您可以简单地复制和粘贴所有内容,因为它定义了“完整”路径,不会因目录而异。
例子
define("ABS_PATH", $_SERVER['DOCUMENT_ROOT']);
or
define("ABS_PATH", dirname(__FILE__));
// This defines the path as the directory the file is in.
然后你可以在任何时候简单地这样做来包含一个文件
include(ABS_PATH . "/path/to/file");
【讨论】:
最简单的方法是使用绝对路径/URL。
对于 URL,在某处定义一个常量/变量,指向应用程序的根目录,例如:
define('ROOT_URL', 'http://www.example.com');
或
$root_url = 'http://www.example.com';
并在每个链接中使用它,例如:
<a href="{$root_url}/my-page.php">blah</a>
这样,总是可以的(当您将项目安装到另一台服务器或子目录中时,您只有一个常量/变量要修改,一切仍然有效)
对于包含/要求,也总是使用绝对路径;一种解决方案是使用dirname,如下所示:
include dirname(__FILE__) . '/my_file.php';
include dirname(__FILE__) . '/../my-other-file.php';
__FILE__ 是当前文件,你正在写这一行; dirname 获取包含该文件的目录的路径(完整路径)。
这样,您就不必担心文件的相对路径。
【讨论】:
另一个答案类似于结合前两个建议。您可以定义常量:
define('ABSPATH', dirname(__FILE__).'/');
那么,假设config.php需要包含在站点的许多文件中,那么您可以使用以下语句来完成此操作:
include(ABSPATH.'config.php');
希望这会有所帮助。
【讨论】:
我过去用于 functions.php 的另一个选项是类自动加载器。
//Class Autoloader
spl_autoload_register(function ($className) {
$className = strtolower($className);
$path = "includes/{$className}.php";
if (file_exists($path)) {
require_once($path);
} else {
die("The file {$className}.php could not be found.");
}
});
这在某些情况下有效,并且在过去我不想定义绝对 $root url 时对我有帮助。
【讨论】: