PHP:require不能正常工作

时间:2012-06-03 13:50:15

标签: php

我有一个目录root:

index.php
includes/
    template.php
    testfile.php
    phpFiles/
        processInput.php
        testfile.php

的index.php:

require_once("includes/template.php");

的template.php:

require_once("includes/phpFiles/processInput.php")

processInput.php:

require_once("testfile.php")
require_once("../testfile.php")

当您运行index.php时,此代码将起作用,当然,当您运行template.php时,它将不起作用。

如您所见,index.php包含template.php,就像普通的一样。但是在template.php中,你必须包括如果你在index.php所在的目录中。但是,在processInput.php中,你包括就好像你在processInput.php所在的目录中一样。

为什么会发生这种情况,如何修复它以使包含路径始终是需要完成的文件的目录?第二个包含文件与请求的文件具有相同的包含路径,但下一个文件没有。

感谢您的帮助!

编辑:奇怪的是我在类文件夹中包含了类。并且它包含了应该包含的其他文件,即使路径是相对的。为什么会发生这种情况,我该如何解决?

非常重要的编辑:我刚刚意识到这一切都是因为在我的例子中,include / phpFiles / processInput.php中的包含在同一目录中包含一个文件:require_once(“同一dir.php中的文件”);这就是原因。如果你要包含一个没有指定文件名以外的文件的文件,那么include_path实际上是写入require的文件所在的目录。可以有人确认吗?

4 个答案:

答案 0 :(得分:5)

使用绝对路径。

require_once($_SERVER['DOCUMENT_ROOT']."/includes/phpFiles/processInput.php");

对所有require d文件使用类似的表单,无论您身在何处,它们都能正常运行。

答案 1 :(得分:2)

您可以通过以下几种方式实现这一目标:

  1. 使用set_include_path来控制执行require()来电的目录。

  2. index.php中定义的常量中定义公共绝对基本路径,并在每个require()语句中使用它(例如require(BASEPATH . '/includes/template.php'))。

  3. 在任何地方使用相对路径,并利用dirname(__FILE__)__DIR__将其转换为绝对路径。例如:require(__DIR__ . '/phpFiles/processInput.php');

  4. 默认情况下,当前工作目录在include路径中使用;您可以通过检查get_include_path()的输出来验证这一点。但是,相对于include()的制作位置,;它与主执行脚本有关。

答案 2 :(得分:1)

你正在使用相对路径。您需要使用绝对路径:$_SERVER['DOCUMENT_ROOT']

当你包含/ require时,你基本上是暂时将所有代码从一个文件移动到另一个文件。

所以如果 file1.php (位于root)包含:

require("folder/file.php");

并在 file2.php 中包含 file1.php (位于不同的位置(例如folder目录):

<强> file2.php:

require("../file1.php");

现在所有 file1.php 代码都在 file2.php 中。所以 file2.php 将如下所示:

require("../file1.php");
require("folder/file.php");//but because file2.php is already in the `folder` directory, this path does not exist...

答案 3 :(得分:0)

的index.php:

require_once("includes/template.php");

的template.php:

require_once("includes/phpFiles/processInput.php")

您的目录结构已关闭。从您正在使用它的文件中可以看到文件包含。因此,“template.php”正在当前文件夹中寻找“includes /”文件夹(/ includes /)。

正如其他人所说,使用绝对路径,这将确保您始终从文件系统根目录开始,或使用:

require_once("phpFiles/processInput.php")

在你的template.php文件中(如果你搬家的话,它更容易破坏,这就是为什么其他人都建议使用文件系统根目录的绝对路径)。

顺便说一句,如果您使用“index.php”作为某种框架系统,您可以考虑定义一个存储公共文件地址的变量,例如:

define('APPLICATION_PATH', realpath(dirname(__FILE__));
define('PHPFILES_PATH', APPLICAITON_PATH . '/includes/phpFiles/');