包含路径解析如何在require_once中工作?

2022-08-30 21:16:49

我正在用PHP编写一个Web应用程序,当我遇到一个奇怪的情况时。为了说明我的问题,请考虑以下结构的 Web 应用:

/
    index.php
    f1/
        f1.php
    f2/
        f2.php

这些文件的内容:

索引.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("../f2/f2.php"); ?>

f2.php:空白

现在当我尝试打开索引时.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:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("f2.php"); ?>

f2.php:空白

令我惊讶(和完全混乱),这很好!

那么,路径解析背后的秘密是什么呢?

PS我看到了这个问题,但它仍然没有回答我在这里陈述的第二种情况。


答案 1

如果包含其他文件,则工作目录将保留在包含文件所在的位置。

您的示例按预期工作。

编辑:第二个示例有效,因为 .(实际目录)位于包含路径中(请参阅错误消息)。

编辑2:在第二个示例中,您感兴趣的关键点是以下行:

<?php require_once("f2.php"); ?>

起初,它会在当前工作目录()中查找,但找不到f2.php。/var/www/req_path_test

作为回退,它将尝试在include_path()中找到f2.php,以“.”开头。(这是相对于实际文件而言的,而不是包含的文件)。'.:/usr/share/php:/usr/share/pear'

因此,'./f2.php'可以正常工作,并且要求不会失败。


答案 2

打开 index.php 时,工作 dir 将设置为此文件所在的文件夹。在插入的f1.php中,此工作目录不会改变。

您可以使用相对于当前包含的文件的绝对路径来包含文件,如下所示:

require_once(dirname(__FILE__).'/../../test/file.php')

但是,如果这些文件包含类,最好考虑使用自动加载程序。


推荐