0

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

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

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

  • 索引.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 的测试,但在上面的示例中没有包含该文件只是为了保持它更干净。它工作得很好)

任何人都可以解释为什么会这样吗? 它应该以这种方式工作,还是这是一个错误?

4

2 回答 2

2

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

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

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

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

于 2013-04-05T15:17:23.843 回答
0

这是因为您首先包含了dirA/a.phpto index.php,所以从现在开始,index.php您的基础文件就是所有包含都来自的基础文件。因此,如果您c.php 从中包含,a.php就像您从index.php

这就是为什么如果你指定一个级别,你会得到错误的结果"../"。它搜索上一层index.php,但什么也没找到。

于 2013-03-16T20:38:09.387 回答