1

我刚刚开始学习 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 系统开头)还是相对于当前目录(以.或开头..)——包含路径将被完全忽略。例如,如果文件名以 开头../,则解析器将在父目录中查找。

4

2 回答 2

3

PHP手册

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

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

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

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

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

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

例子:

索引.php:

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

文件夹 1/file.php:

require('folder2/file.php');

文件夹 2/file.php:

require('folder3/file.php');

等等..

于 2011-01-29T11:06:45.727 回答
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

这不存在。

这就是为什么他们让您从网站的根目录开始您的路径。

于 2011-01-29T10:47:06.447 回答