【问题标题】:How do I require files in other directory branches?如何要求其他目录分支中的文件?
【发布时间】:2011-05-02 23:46:31
【问题描述】:

当我尝试使用requirerequire_once 时,如果需要的文件在同一个子目录中,它会正常工作,但是当它看到其子目录之外的文件时,它会产生致命错误。这基本上是文件树的样子:

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

...所以基本上,如果我要让 main.php 需要 login/login.php,那很好,但是如果我尝试对 login.php 进行目录遍历以要求 include/session.php,它会失败,导致错误:

PHP 致命错误:require_once():打开失败需要 [...]

这个概念的代码是:

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

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

【问题讨论】:

  • "`" 用于内联代码。对于code blocks,每行额外缩进四个空格。编辑器工具栏中的“{}”按钮会为您执行此操作。 “*”、“-”或“+”可用于列表。检查我的编辑,看看如何。单击编辑器工具栏中的橙色问号以获取有关格式设置的更多信息和提示。
  • 您的意思是在引用$_SERVER 变量时使用函数表示法(括号)而不是数组索引(方括号)吗?如果是这样,那可能就是您无法让它们工作的原因。

标签: php recursion require require-once


【解决方案1】:

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

【讨论】:

  • 有效。我只需要找到一种方法让它根据目录根动态设置包含路径。
  • 您将使用引导程序,您的页面的第一个包含应该始终是设置路径的 bootstrap.php 文件。
【解决方案2】:

这不是递归,它只是简单的旧目录遍历。

切勿对包含/要求使用相对路径。你永远不知道你的脚本是从哪个目录调用的,所以你总是有可能在错误的工作目录中。这只是头痛的秘诀。

总是使用dirname(__FILE__) 来获取当前文件所在目录的绝对路径。如果您使用的是 PHP 5.3,则只需执行 __DIR__。 (注意前后两个下划线。)

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

(顺便说一句,include/require 周围不需要括号,因为它是一种语言结构,而不是函数。)

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

【讨论】:

  • 对不起,我在处理这个问题的同时也在研究递归,这只是一个大问题。
  • 相对路径有其用途。而且“从不使用相对路径”有点虚伪,考虑到您正在使用dirname(__FILE__) 做完全相同的事情(甚至伪装!)。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多