0

当使用 PHPinclude()require()函数来包含一个文件,而该文件又包含另一个文件时,第二个文件的 PWD(相对引用)include()是原始脚本位置(Apache 调用堆栈中的第一个脚本)的目录,而不是当前文件。其背后的设计决策是什么,用例是什么?

例如,假设定义了一个通用数据库连接类,~/public_html/classes/database.php其中将其配置数据(用户名、密码)存储在~/config.php. 数据库配置类的作者会在逻辑上使用相对文件名调用配置文件../../config.php。但是,这不能按预期工作,因为 PWD 不是database.php文件,而是包含它的文件,可能是~/public_html/index.php~/public_html/someDir/somePage.php或其他地方。

我知道通过获取当前文件的目录来解决这个问题dirname(__FILE__)。但是,我想不出我想要require()include()相对于原始脚本位置的单个用例。保持原样的用例是什么?

4

2 回答 2

1

该函数include()require()句柄相对路径与任何其他文件访问函数(如fopen()unlink()mkdir().

无论脚本的位置如何,路径总是相对于 PWD。

考虑以下示例:

/home/foo/index.php确实

require_once('lib/maketest.php');

/home/foo/lib/maketest.php确实

mkdir('test');

这将创建目录/home/foo/test不是 /home/foo/lib/test


我可以想象这是选择的,因为无论脚本位于何处,mkdir test都会创建目录的 bash 脚本。$PWD/test

遵循include()与其他文件访问函数相同的逻辑是有意义的。考虑以下代码:

if (file_exists('config.php')) include('config.php');

如果路径include()相对于PWD__DIR__和路径,file_exists()则上述代码将无法按预期工作。

于 2013-03-22T22:47:53.893 回答
1

PWD 是打印工作目录的缩写。当前工作目录缩写为 CWD。
CWD 可能会在代码执行期间发生变化,PHP 不一定必须包含来自本地文件路径的代码。

如您所知,__FILE__一起检查dirname()是解决问题的正确方法。您还应该使用应用程序的根路径定义一个常量,并在整个代码中使用它,而不是依赖于工作目录保持不变。
在所有情况下,CWD 甚至都不是脚本起点的路径。

于 2013-03-22T23:17:22.997 回答