2013-03-16 96 views
0

,则不会包含相关文件,但我没有发现任何与此问题相关的帖子。 。我很抱歉,如果我错过了相关的。PHP将包含一个与调用脚本相关的文件,但如果包含路径包含“../”

从我从PHP的文档,并在这里从其他职位收集,PHP的包括(和include_once)执行以下操作:

文件包含基础,给予或者如果没有给出文件路径中,指定include_path。如果在include_path没有找到文件,包括将在调用脚本本身的目录和当前工作目录没有

,最后才选中我有一个给定的目录结构如下:

  • 的index.php
  • /DIRA(包含a.php只会和b.php)
  • /DIRB(包含c.php)

从索引。 PHP include_once "dirA/a.php"

下面是a.php只会内是什么在起作用:
include_once "b.php"
include_once "../dirB/c.php"

的奇怪的事情:
include_once "b.php"
include_once "dirB/c.php"

下面是从a.php只会内没有按“T工作对我来说,b.php是相对于“调用脚本自己的目录”而被包含的,但是c.php仅被认为是相对于当前工作d irectory(这是包含index.php的dir)。这似乎与我略有不一致。 PHP将包含一个相对于调用脚本的文件,但如果包含路径包含../,则不会 - 为什么? 为什么../父目录指令不是相对于调用脚本工作,而是相对于当前工作目录?(注:我测试了它相对于CWD,但不包括在我的例子,上面的文件,只是为了保持其清洁它的工作就好了。)

任何人都可以提供一些线索来这是为什么? 应该它以这种方式工作,或者这是一个错误?

+0

Eh。 PHP有时候很奇怪。我通常只是将应用程序的根添加到'include_path'并指定相关的所有内容。从长远来看,它可以减少混淆,同时不会牺牲四处移动的能力。 – cHao 2013-03-16 20:38:11

+0

看起来好像你的评论可能和我打算在这个上面一样。如果你让它成为答案,我会接受它... – 2013-03-17 23:45:28

回答

2

PHP在查找文件方面有点奇怪。如果您包含名称以斜杠或点号开头的文件,则PHP完全忽略include_path。如果一个点,它假定名称是相对于脚本启动的一切(即:Web服务器决定运行的那个脚本)。

如果你想指定一个相对于包含脚本而不是启动文件的路径,你真正想要的是一个绝对包含文件,它指定了文件的全名。这很容易处理__FILE____DIR__常量,它们反映了当前正在运行的脚本的名称和目录。

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

如果你喜欢,你还可以设置include_path配置设置,包括应用程序的根目录,只是指定文件名都相对于这一点。

0

这是因为你已经第一次包括dirA/a.phpindex.php,所以从现在开始index.php是你的基本文件,所有包括这些文件都在其中。因此,如果包括c.phpa.php这就像你从index.php

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

+0

谢谢,但这并不完全回答我的问题。如果每个包含*仅*相对于index.php,则包含来自a.php的“b.php”将不起作用。 ('include“b.php”'是相对于a.php的) – 2013-03-17 00:56:32