【问题标题】:How can I include files using paths relative to where the file resides?如何使用相对于文件所在位置的路径包含文件?
【发布时间】:2011-12-16 04:52:19
【问题描述】:

假设我在父目录中有两个目录,foobar,这些目录包含一些 PHP 文件:

/
/index.php

/foo
/foo/functions.php
/foo/stuff.php

/bar
/bar/doodie.php

假设:

  1. functions.php 包括 stuff.php
  2. index.php 包括 functions.php
  3. doodie.php 包括 functions.php

基于这个结构,当index.php运行时,它会在/foo目录中寻找/foo/functions.php但是stuff.php 必须根据index.php 的位置使用相对路径包含在内。这在运行 index.php 的情况下有效。 在调用doodie.php 时不起作用,因为functions.php/foo 目录中查找stuff.php,当位置为/bar 时该目录不存在。

是否可以在不使用绝对路径(和session variables)的情况下根据文件所在位置而不是调用位置来包含文件?

如果不清楚,我很抱歉,描述这个真的很难......

【问题讨论】:

  • 由于某种原因它不会让我发帖。 JohnP 说的基本上都是我想说的。祝你好运!

标签: php


【解决方案1】:

应该使用绝对路径。

当然,您不需要每次都包含完整路径。通常的过程是您定义一个称为 APP_PATH 的常量,并在引导程序中设置应用程序的绝对路径。

之后,只要您想包含一个文件,请在您的包含调用中附加 APP_PATH 常量。这将解决您的问题。

您还可以查看 include_path 选项,这取决于您的文件的位置 - http://php.net/manual/en/function.set-include-path.php

【讨论】:

  • 我了解这个解决方案,但我在哪里存储 APP_PATH 常量?从不同的地方调用它会不会产生同样的问题?
  • @Ozbekov absolute 路径的唯一目的是“从不同的地方调用时不会产生相同的问题”。之所以称为“绝对”是因为
  • 你知道为什么 PHP 不尊重前导斜杠来创建相对于文档根目录的路径吗?例如,当在网站上发布图像 url 时,这很有效。 include '/index.php'
  • @mrtsherman PHP 尊重文件系统。 PHP 可以并且经常访问文档根目录之外的内容。
  • @mrtsherman 因为就浏览器而言,这是域的绝对路径,与网络服务器文件系统是分开的。
【解决方案2】:

你可以这样做:
在基础文件夹中创建一个文件;在这个文件中定义这些变量
定义('根',服务器['DOCUMENT_ROOT']);这样可以确保获得根文件夹
定义('foo', root . '/foo/');这定义了 foo 文件夹的路径
定义('bar',根。'/bar');这定义了 bar 文件夹的路径

现在,在您需要调用的任何文件中,包含基本文件,您就可以访问任何这些文件夹中的任何文件。
因此,如果您已经在 /bar/doodie.php 中,只需 include(foo .'functions.php'),反之亦然。
希望对您有所帮助。

【讨论】:

    【解决方案3】:

    我建议你走许多 MVC 的路线。它既简单又可靠。只需将所有请求重定向到根目录中的 index.php?path=database.php(比如说 bootstrap.php)形式的一个文件,然后定义路径。这是我在自制 MVC 框架中使用的文件示例。

    /**
     * BASE_PATH is for server side inclusions.
     * BASE_URL is for client side inclusions (scripts, css files, images etc.) 
     */
    define("DS", DIRECTORY_SEPARATOR);
    define("BASE_PATH", dirname(realpath(__FILE__)).DS);
    define("BASE_URL", dirname(realpath($_SERVER["SCRIPT_NAME"])).DS);
    define("APP_PATH", BASE_PATH."application".DS);
    
    //$url = $_GET['base_url'];
    
    
    /**Include core file which loads all necessary files */
    require_once (BASE_PATH."core".DS."core.php");
    

    这里是core.php(只有一行,因为它有很多行)

    //Load config files
    require_once(BASE_PATH."config".DS."config.general.php");
    

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2012-12-26
      • 2016-07-22
      • 2012-07-28
      • 2011-12-08
      • 2013-04-09
      • 2023-04-06
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多