【问题标题】:PHP will include a file relative to a calling script, but not if the include path contains "../"PHP 将包含一个相对于调用脚本的文件,但如果包含路径包含“../”则不会
【发布时间】:2013-03-05 11:11:59
【问题描述】:

根据我从 PHP 的文档和此处的其他帖子中收集到的信息,PHP 的 include(和 include_once)执行以下操作:

根据给定的文件路径包含文件,如果没有给出,则根据指定的 include_path。如果在 include_path 中找不到该文件,则 include 最终会在失败前检查调用脚本自己的目录和当前工作目录

我在给定目录中有以下结构:

  • index.php
  • /dirA(包含a.php和b.php)
  • /dirB(包含c.php)

来自 index.php include_once "dirA/a.php"

以下是在 a.php 中的工作原理:
include_once "b.php"
include_once "dirB/c.php"

以下是在 a.php 中不起作用的内容:
include_once "b.php"
include_once "../dirB/c.php"

对我来说奇怪的是,b.php 是相对于“调用脚本自己的目录”而包含的,但 c.php 只被认为是相对于当前工作目录(即包含 index.php 的目录)。这对我来说似乎有点不一致。 PHP 将包含一个与调用脚本相关的文件,但如果包含路径包含 ../,则不会包含 - 为什么? 为什么 ../ 父目录指令相对于调用脚本不起作用,但它会相对于当前工作目录?(注意:我测试了它相对于 cwd 但没有包括它在我上面的示例中的文件只是为了保持它更干净。它工作得很好)

谁能解释这是为什么? 应该以这种方式工作,还是这是一个错误?

【问题讨论】:

  • 嗯。 PHP 有时很奇怪。我通常只是将应用程序的根添加到include_path 并指定与之相关的所有内容。从长远来看可以减少混乱,而不会牺牲移动物品的能力。
  • 看起来你的评论可能和我要写的一样多。如果你把它作为一个答案,我会接受它......

标签: php include relative-path


【解决方案1】:

PHP 查找文件的方式有点奇怪。如果包含名称以斜线或点开头的文件,PHP 将完全忽略include_path。如果是点,则假定名称与启动所有内容的脚本相关(即:Web 服务器决定运行的脚本)。

如果您想指定相对于包含脚本而不是启动脚本的路径,那么您真正需要的是指定文件全名的绝对包含。使用 __FILE____DIR__ 常量很容易做到这一点,它们反映了当前运行脚本的名称和目录。

include __DIR__ . '/../dirB/c.php';

如果您愿意,您还可以设置 include_path 配置设置以包含应用程序的根目录,并指定与该根目录相关的所有文件名。

【讨论】:

    【解决方案2】:

    这是因为您首先将 dirA/a.php 包含到 index.php ,所以从现在开始 index.php 是您的基本文件,所有包含都来自该文件。因此,如果您包含来自a.phpc.php,就像您从index.php 执行此操作一样

    这就是为什么如果您使用 "../" 指定上一级会得到错误结果的原因。它在index.php 上方搜索一级,但一无所获。

    【讨论】:

    • 谢谢,但这并不能完全回答我的问题。如果每个包含都相对于 index.php,那么从 a.php 中包含“b.php”将不起作用。 (include "b.php" 相对于 a.php)
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2014-04-24
    • 2014-11-15
    相关资源
    最近更新 更多