PHP include():用例从原始脚本'


PHP include(): Use case for include from original script's PWD

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

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

我知道通过使用dirname(__FILE__)获取当前文件的目录来解决这个问题。然而,我想不出一个单独的用例,我希望require()include()相对于原始脚本位置。它现在的用例是什么?

函数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()中的路径相对于__DIR__, file_exists()中的路径相对于PWD,则上述代码将无法按预期工作。

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

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