【问题标题】:PHP include file that includes a file up the directory treePHP 包含文件,其中包含目录树上的文件
【发布时间】:2017-10-06 16:40:03
【问题描述】:

我有这个目录树:

test.php
foodir
`---- foo.php
bardir
`---- bar.php

当我打开 test.php 时,我包含了 foo.php。然后,我希望 foo.php 包含 bar.php。

test.php:

include 'foodir/foo.php';

foo.php:

include '../bardir/bar.php';

但是,当我打开 test.php 时,我得到:

警告:include(../bardir/bar.php):打开流失败:没有这样的文件或目录

我注意到如果我将目录树更改为:

test.php
foodir
`---- foo.php
 ---- bardir
      `---- bar.php

然后把 foo.php 改成:

include 'bardir/bar.php';

一切正常。看来我可以包含与当前包含的文件相关的文件。
但是,为什么我不能沿着该文件的目录树向上移动?

编辑:

我知道我可以将include 'bardir/bar.php' 放入foo.php。它会在 test.php 的位置搜索 bar.php。但是,如果我从 test.php 所在目录以外的目录中的文件中包含 foo.php,那并不能解决我的问题。那是因为在另一个目录中,bardir/bar.php 将不存在。

【问题讨论】:

  • 我不知道为什么......我一次又一次遇到同样的问题。我解决了我只包含魔术常数__DIR__ 的问题。我认为问题在于$SERVER['WEB_ROOT'],这可能是每个包含的起点
  • includes 与包含它们的文件的文件夹无关,而是与 php.ini 配置文件中定义的包含路径相关,并且(通常,因为该路径列表中的第一个条目是一个“.”)当前工作目录(通常是正在执行的主脚本的文件夹)

标签: php


【解决方案1】:

当您使用include 'foodir/foo.php'; 时,该文件现在基本上在test.php 的“范围”内运行。

因此,该文件中的包含include '../bardir/bar.php';

将向上一个文件夹,然后搜索 bardir,它不存在: (它正在寻找这种安排:)

parent/test.php
parent/foodir
      `---- foo.php
bardir
   `---- bar.php

所以,在foo.php 中使用的正确包含是include 'bardir/bar.php';

简而言之:如果您打开 test.php,则任何包含文件中使用的所有包含路径都应相对于 test.php 的位置 - 而不是它们的实际位置。

ps.:正如 cmets 中提到的:includes 首先检查定义的 include-dir,只有当没有匹配时,路径才被认为是“相对”的。

【讨论】:

  • 在您的编辑中:是的,这就是重点 - 这就是为什么几乎所有网站都通过他们的 index.php 文件管理everything。因为那样,您就没有问题,您可以从不同的“文件夹深度”访问同一个文件,这允许您设计所有相对于 index.php 的包含。 (即使对于 ajax 调用,您也经常可以看到访问是通过 index.php 以某种方式代理的)(仅看到像 /comment/45568/question.php 这样的路径并不意味着那是一条物理路径。大约 95% 的时间都是 Url-Rewriting)
【解决方案2】:

简单地做:

include dirname(__DIR__).'/bardir/bar.php';

__DIR__ 是使用/调用此常量的文件的绝对目录路径(无论它来自何处),因此__DIR__ 等于/full/absolute/path/foodir。并且dirname(__DIR__) 将路径向上移动一个目录,因此dirname(__DIR__) /full/absolute/pathbar.php 所在的位置是/full/absolute/path/bardir。这就是我们想要的,这就是我们得到的。

这样您就不必担心包含路径相对性。无论foodir/foo.php 是从哪里包含的,它都能在任何情况下工作

【讨论】:

    【解决方案3】:

    "当您使用include 时,它假定要查找的基目录 file 是当前文件的目录"

    因此,当您必须包含来自另一个目录的文件时,您必须指定父目录的相对路径,如此处"Base" 包含所以让我们说

    Base -> A
           ->file1.php
          ->B
           ->file1.php
    

    我们将使用

    include "../A/file1.php";
    

    用于从 A 添加文件,反之亦然。

    假设../是指定目录的上一级

    你也可以使用__DIR__ 像内置常量来获取当前文件的目录名

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 2013-05-03
      • 2011-08-02
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2010-09-23
      • 1970-01-01
      相关资源
      最近更新 更多