使用相对路径包含文件上的文件:只在某些时候工作


include file on file included on file with relative path: working only sometimes

我的网站结构是这样的。

HTDOCS文件夹:/WEB/mysite/htdocs/

ADMIN文件夹:/WEB/mysite/htdocs/admin/

EDIT ADMIN folder: /WEB/mysite/htdocs/admin/edit

HTACCESS保护文件夹:/WEB/mysite/htdocs/admin/flock/

TEST文件夹:/WEB/mysite/htdocs/test/

情况1

下面的script1.php放在Admin文件夹中:

<?php
require_once 'flock/sql.php' or die("Error");
?>

现在我将script1.php包含在Edit admin文件夹中的scripttest.php中:

<?php
require_once '../script1.php' or die ("Error");
?>

情况2

现在我把script2.php放在Test文件夹中:
<?php
require_once '../admin/flock/sql.php' or die("Error");
?>

并从scripttest.php调用它,总是放在Edit admin文件夹中:

<?php
require_once '../../test/script2.php';
?>

它不会再工作了。以下是错误:

Warning: require_once() [function.require-once]:
Unable to access ../admin/flock/sql.php in /WEB/mysite/htdocs/test/script2.php
on line 2
Warning: require_once(../admin/flock/sql.php) [function.require-once]:
failed to open stream: No such file or directory in /WEB/mysite/htdocs/test/script2.php
on line 2
Fatal error: require_once() [function.require]: Failed opening required
'../admin/flock/sql.php' (include_path='/usr/local/lib/php/:/WEB/mysite/') in
/WEB/mysite/htdocs/test/script2.php on line 2.

这两种情况是一样的。不是吗?为什么情形二不能工作?

相对路径就像相对方向,如果我告诉你向前走两步,向左走一步,如果你每次都从同一个地方开始,你最终会到达正确的地方。php的起始点是主脚本开始执行的地方。为了让生活更正常,你需要建立一些你可以包含的相对路径点。

常用的有:

  1. $_SERVER["DOCUMENT_ROOT"] -这是您的域根目录(文件系统路径,涉及到http://www.mysite.com/)
  2. __DIR__ -一个常量,它是当前文件的目录。

通常创建一个常量来建立一个对你的项目有意义的位置是一个好主意…例如,

// site_config.php -- located in a config directory next to your document root.
define("COMMON_INCLUDES", $_SERVER["DOCUMENT_ROOT"]."/includes");

site_config.php将通过以下方式包含在所有页面中:

include($_SERVER["DOCUMENT_ROOT"]."/../config/site_config.php");

,当你需要从包含中取出一个资源时,你可以输入

include(COMMON_INCLUDES."/header.php");

不,它们不一样。在本例中,相对路径基于启动包含链的文件的位置。使用__DIR__常量使路径相对于每个包含被调用的文件:

<?php
// will evaluate to /WEB/mysite/htdocs/admin/flock/sql.php always
require_once __DIR__ . '/flock/sql.php' or die("Error");
?>