路径混乱:相对/绝对/相对于DOCUMENT_ROOT?

时间:2011-01-29 10:39:40

标签: php include-path

我刚刚开始学习PHP,我已经阅读了几个类似问题的几个答案,但它没有帮助。

我有几个文件:

index.php 
folder1\file.php
folder2\file.php 

因此index.php包含folder1\file.php,这非常简单。然后folder1\file.php包含folder2\file.php。我正在阅读的书说要做到这一点我必须在folder1\file.php内写下这个:

require $_SERVER['DOCUMENT_ROOT'] . '/' . 'folder2/file.php';

所以基本上他们为什么不这样做?

require 'folder2/file.php';

据我所知,所有路径都始终与初始脚本的位置相关,并且在我的机器上运行正常。

我仍然不明白为什么不使用.\folder\file.php,如果我更深入地移动我的目录或将整个网站复制到另一台机器,它将继续工作。

根据手册:如果定义了路径 - 是否绝对(在Windows上以驱动器号或\开头,在Unix / Linux系统上以/开头)或相对于当前目录(从...开始 - 包含路径将被完全忽略。例如,如果文件名以../开头,则解析器将查找父目录。

2 个答案:

答案 0 :(得分:3)

PHP手册says

  

根据文件包含文件   给出的路径,或者,如果没有给出,则   include_path已指定。如果是文件   在include_path中找不到,   include()最终会检查   调用脚本自己的目录和   之前的当前工作目录   失败。

因此,使用 set_include_path()方法在主文件(在您的情况下为index.php)中设置包含路径始终是最佳做法。

使用框架或自定义服务器时,最好通过执行以下操作来指定包含路径而不留下系统定义的包含路径:

set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT']);

这样,您的新包含路径将添加到现有路径中。

对于您在问题中提出的问题,最好如上所述指定包含路径,然后相对地引用您的文件。如果以后您想要移动文件,只需编辑一行即可,而不是查找和替换数百个文件。

实施例

<强>的index.php:

set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT']);
require('folder1/file.php');

<强>的folder1 / file.php:

require('folder2/file.php');

<强>文件夹2 / file.php:

require('folder3/file.php');

依旧......

答案 1 :(得分:1)

仅仅因为它是好的做法。并非所有使用folder2 / file.php的脚本都将从根目录中调用。

说你有没有

index.php
folder1\file.php
folder2\file.php
folder3\use-folder2.php

并且您尝试从use-folder2.php中包含来自folder2的file.php,然后使用您的想法,它将查找该文件的路径:

folder3\folder2\file.php

不存在。

这就是为什么他们会让你从网站的根目录开始。