3

我有一个目录根:

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

索引.php:

require_once("includes/template.php");

模板.php:

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

进程输入.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 所在的目录中一样包含。

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

谢谢你的帮助!

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

非常重要的编辑:我刚刚意识到这一切都是因为在我的示例中,includes/phpFiles/processInput.php 中的包含包括同一目录中的一个文件: require_once("file in same dir.php"); 这就是原因。如果您包含一个文件而没有指定文件名以外的任何内容,则 include_path 实际上是写入要求的文件所在的目录。任何人都可以确认这一点吗?

4

4 回答 4

7

使用绝对路径。

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

对所有 d 文件使用类似的表格,require无论您身在何处,它们都可以使用。

于 2012-06-03T13:52:18.390 回答
3

您可以通过以下几种方式执行此操作,其中包括:

  1. 用于set_include_path控制执行require()调用的目录。

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

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

默认情况下,在包含路径中使用当前工作目录;您可以通过检查get_include_path(). 但是,这与制造地无关include();它与主执行脚本有关。

于 2012-06-03T13:57:32.113 回答
1

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

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

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

require("folder/file.php");

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

文件2.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...
于 2012-06-03T13:53:15.363 回答
0

索引.php:

require_once("includes/template.php");

模板.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/');
于 2012-06-03T13:59:42.460 回答