1

我想我会问,以防我能做得更好。

在我的本地(WAMP)上,我的所有网站都在 www 文件夹中。( C:\wamp\www)

现在,当我包含一个文件时,我会这样做:

require_once("".$_SERVER['DOCUMENT_ROOT']."/lib/config.php");

当我在本地工作并将网站上传到网络主机时,我想确保路径不会中断我

有人可以告诉我我是否应该这样做吗?

我想确保最大的兼容性;这意味着如果我将站点从本地移动到我决定使用的任何网络主机,或者如果我从一台主机移动到另一台主机,则路径不会中断。

也许有一种更防弹的方式来做到这一点?

4

4 回答 4

2

您应该看到包含路径。对于那个set_include_path很有用。

于 2011-04-22T17:25:46.430 回答
2

使用的问题$_SERVER['DOCUMENT_ROOT']是,如果您将 PHP 脚本向上或向下移动到目录级别,它将中断。而是使用这个:

require_once(dirname(__FILE__) . "/lib/config.php");

__FILE__是脚本的绝对路径。dirname()删除最后一个路径组件(脚本文件名),以便您可以将其他路径组件附加到它,例如/lib/config.php/../../lib/config.php其他。这将在任何地方工作。

PHP 5.3 引入了 的简写dirname(__FILE__),称为__DIR__,但这在 <5.3 中不起作用。

于 2011-04-22T16:52:32.207 回答
1

这适用于包含配置文件(尽管我会去掉开头的引号)

require_once( $_SERVER['DOCUMENT_ROOT'] . "/lib/config.php" );

如果您包含来自一堆不同目录的配置文件,这确实是唯一的方法。

在更大的项目 id 上说“大多数”开发人员都有一个前端控制器,所有脚本都是从该控制器加载的。这个前端控制器加载配置文件,因为它的同一个文件总是包含配置文件,所以不需要$_SERVER['DOCUMENT_ROOT'].

于 2011-04-22T16:51:57.910 回答
1

我通常做的是制作 1 个配置文件(可能包括其他文件),其中包含一些非常基本的常量:

define('PROJECT_ROOT', dirname(dirname(__FILE__))); // or dirname(__DIR__) for PHP 5.3
define('PROJECT_WEB', $_SERVER['DOCUMENT_ROOT']);
// etc

我的所有其他文件/包含都将基于那些非常简单的常量。我永远不需要相对路径,也永远不需要 include_path,因为两者PROJECT_ROOT都是PROJECT_WEB“真实的”/绝对的。

其他有用的 (?) 常量将是PROJECT_LOGIC和/或PROJECT_CONTROLLERS和/或PROJECT_3RD_PARTY等。

于 2011-04-22T17:31:13.937 回答