【问题标题】:Include relative path works strangely包含相对路径奇怪地工作
【发布时间】:2021-05-08 03:33:40
【问题描述】:

我有这个文件夹和文件结构:

  • public_html(文件夹)
    • index.php(文件)
  • 资源(文件夹)
    • 配置(文件夹)
      • main_config.php(文件)
    • render_template.php(文件)-(该文件与configs文件夹在同一级别,在resources文件夹内)

在 index.php 中我调用:

require_once("../resources/render_template.php");

在 render_template.php 我调用:

require_once("configs/main_config.php");

或者:(两者都有效)

require_once("../resources/configs/main_config.php");

我的问题:

  1. 为什么require_once("configs/main_config.php") 有效?现在不应该路径需要相对于 index.php,因为 render_template.php 文件包含在 index.php 中,这意味着需要添加 ../resources/ 以离开 public_html 文件夹?

  2. 如果第一种方法是正确的,为什么require_once("../resources/configs/main_config.php"); 会起作用?

【问题讨论】:

    标签: php path include


    【解决方案1】:

    它的工作方式一点也不奇怪。它遵循一个逻辑模式。

    1. 为什么require_once("configs/main_config.php") 有效?

    它之所以有效,是因为它不会根据包含此“父”文件的位置来评估相对路径。 main_config.php 包含在 render_template.php 中。它不需要知道render_template.php 可能包含在哪里。

    如果它实际上取决于包含父文件的位置,那么您需要为来自不同文件夹的文件定义不同的相对路径,这显然是行不通的。它必须是通用的,以便脚本可以包含在任何需要的地方。

    这是通过首先包含“最低”级别的文件来实现的。 index.php 包括 render_template.php,其中包括 main_config.php。这意味着在render_template.php 内容添加到index.php 之前,main_config.php 内容将添加到render_template.php。所以它们最终会一起被添加到index.php 中调用require_once("../resources/render_template.php") 的地方。

    1. 如果第一种方法是正确的,为什么require_once("../resources/configs/main_config.php"); 会起作用?

    没有理由不工作。如果您采用我们在第一个答案中所述的内容(它与“父级”的包含位置无关),它会遵循一条确切的路径:

    • 我们目前位于resources 文件夹中,位于render_template.php
    • 我们将上一层 (..) 移动到“根”文件夹(其中包含 public_indexresources 文件夹)。
    • 我们移回resources 文件夹。其余的都很简单。

    【讨论】:

    • 这个答案很好,非常感谢。但我还有另一个问题,在 main_config.php 文件(位于 configs 文件夹中)我尝试 require_once("../paths.php");路径文件与 render_template 文件(在资源文件夹中)处于同一级别,但它向我发出警告:require_once(../paths.php): failed to open stream: No such file or directory in. 所以按照与您解释的逻辑相同,它应该可以工作,因为它看不到 main_config 或 render_template 在哪里,但事实并非如此?将路径更改为“../resources/paths.php”使其工作。
    • 你在这里犯了一个错误。如果他们在同一级别,您只需要require_once("paths.php");../ 将您带到上一级,但该文件不存在。
    • 由于某种原因,“/paths.php”也不起作用,只有“../resources/paths.php”。
    • 对不起,我在上面的评论中更正了。我放错了/
    • 我也试过了,但没用:/这是结构:资源(文件夹)-配置(文件夹)-main_config.php(文件)-render_template.php(文件)-(这个文件是与 configs 文件夹位于同一级别,在资源文件夹内)-paths.php -(与上述文件相同的位置,在 configs 文件夹之外)“../paths”,“paths”- 仅适用于“../资源/paths.php”出于某种原因工作。我在此评论中添加了更新文件夹结构,也许它会帮助您帮助我。谢谢你的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多