当我遇到一个奇怪的情况时,我正在
PHP编写一个网络应用程序.为了说明我的问题,考虑一个这个结构的网络应用程序:
/ index.PHP f1/ f1.PHP f2/ f2.PHP
<?PHP require_once("f1/f1.PHP"); ?>
f1.PHP:
<?PHP require_once("../f2/f2.PHP"); ?>
f2.PHP:空白
现在当我尝试在我的浏览器中打开index.PHP时,我得到这个错误:
Warning: require_once(../f2/f2.PHP) [function.require-once]: Failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.PHP on line 2 Fatal error: require_once() [function.require]: Failed opening required '../f2/f2.PHP' (include_path='.:/usr/share/PHP:/usr/share/pear') in /var/www/reqtest/f1/f1.PHP on line 2
有没有什么明显的我失踪了?包含路径在PHP中如何工作?
在我问这个问题之前,我尝试了解一下.我设置了另一个测试,就像这样:
/ index.PHP f1/ f1.PHP f2.PHP
<?PHP require_once("f1/f1.PHP"); ?>
f1.PHP:
<?PHP require_once("f2.PHP"); ?>
f2.PHP:空白
令我惊讶(和完全混淆),这样做很好!
那么路径解析背后的秘诀是什么呢?
PS我看到了this question,但仍然没有回答我在这里所说的第二种情况.
如果包含其他文件,工作目录将保留在包含文件的位置.
您的示例正在按预期工作.
编辑:第二个例子是因为. (实际目录)在您的包含路径中(请参阅您的错误消息).
EDIT2:
在您的第二个例子中,您感兴趣的关键点是这一行:
<?PHP require_once("f2.PHP"); ?>
起初它会查看当前的工作目录(/ var / www / req_path_test),但是找不到f2.PHP.
作为回退,它将尝试在您的include_path(‘./usr/share / PHP:/usr/share / pear’)中找到f2.PHP,以’.’开头. (这是相对于实际的文件,而不是包括).
所以’./f2.PHP’工作,而require不会失败.