2010-10-31 61 views
1

当我尝试使用requirerequire_once时,如果所需的文件位于相同的子目录中,但当它在其子目录之外看到文件时,它将正常工作,它会产生致命错误。这是基本的文件树的样子:如何在其他目录分支中需要文件?

* main.php 
+ login/ 
    * login.php 
+ includes/ 
    * session.php 

...所以基本上,如果我有main.php需要登录/ login.php中,它的罚款,但如果我尝试做目录遍历login.php中要求包括/ session.php文件,它失败,从而导致错误:

PHP Fatal error: require_once(): Failed opening required [...]

这一概念的代码将是:

require('login/login.php') #works fine (main.php) 
require('../includes/session.php') #quits (login.php) 

我已经使用$_SERVER('DOCUMENT_ROOT')试过,$_SERVER('SERVER_ADDR')dir(_FILE_)chdir(../)。我记得几个月前我在解决这个问题时正在开发一个项目,这是一个遍历文件路径的简单函数,但是我再也找不到它了。有任何想法吗?

+0

“\'”用于内联代码。对于[代码块](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks),每行缩进一个额外的四个空格。编辑器工具栏中的“{}”按钮可以为您做到这一点。 “\ *”,“ - ”或“+”可用于列表。检查我的编辑,看看如何。单击编辑器工具栏中的橙色问号以获取更多信息和格式化提示。 – outis 2011-09-26 23:31:18

+0

当您引用'$ _SERVER'变量时,是否使用函数表示法(括号)而不是数组索引(方括号)?如果是这样,那可能是你无法让他们工作的原因。 – outis 2011-09-26 23:35:50

回答

1

这不是递归,它只是普通的旧目录遍历。

从不使用include/require的相对路径。你永远不知道你的脚本从哪个目录被调用,所以总有可能你会进入错误的工作目录。这只是令人头痛的食谱。

总是使用dirname(__FILE__)来获取当前文件所在目录的绝对路径。如果你使用PHP 5.3,你可以只做__DIR__。 (注意两个下划线正面和背面。)

require dirname(__FILE__).'/../includes/session.php'; 

(顺便说一句,你不需要的括号包括/需要,因为它是一种语言结构,不是一个函数。)

使用绝对路径可能也有更好的性能,因为PHP不需要查看include_path中的每个目录。 (但是这只适用于在include_path中有多个目录。)

+0

对不起,我在这个问题的同时正在处理递归,这只是一个令人头疼的问题。 – Nik 2010-10-31 04:59:04

+0

相对路径有其用途。 “永远不要使用相对路径”有点虚伪,因为你用'dirname(__ FILE __)'来做同样的事情(甚至是伪装!)。 – cHao 2010-10-31 07:10:12

3

使用set_include_path(),它会让你的生活更轻松。

+0

现在测试.... – Nik 2010-10-31 04:55:43

+0

工程。我只需要找到一种方法让它根据目录根目录动态设置包含路径。 – Nik 2010-10-31 05:19:12

+1

您将使用引导过程,您的第一个包含您的页面应始终是您的bootstrap.php文件,它设置您的路径。 – Scott 2010-10-31 05:20:54

相关问题