当使用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()
相对于原始脚本位置。它的用例是什么?
答案 0 :(得分: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()
中的路径与__DIR__
相对,file_exists()
中的路径与PWD相同,则上述代码将无法按预期工作。
答案 1 :(得分:1)
PWD是打印工作目录的缩写。当前工作目录缩写为CWD CWD可能在代码执行期间发生变化,PHP不一定要包含本地文件路径中的代码。
如您所知,与__FILE__
一起检查dirname()
是解决问题的正确方法。您还应该使用应用程序的根路径定义常量,并在整个代码中使用该常量,而不是依赖于工作目录保持不变。
在所有情况下,CWD甚至都不是脚本起点的路径。