PHP:require不需要';它不能正常工作

PHP:require不需要';它不能正常工作,php,Php,我有一个目录根: index.php includes/ template.php testfile.php phpFiles/ processInput.php testfile.php index.php: require_once("includes/template.php"); require_once("includes/template.php"); template.php: require_once("include

我有一个目录根:

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

require_once("includes/template.php");
require_once("includes/template.php");
template.php:

require_once("includes/phpFiles/processInput.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所在的目录中,则必须包含like。但是,在processInput.php中,您包含的内容就好像您在processInput.php所在的目录中一样

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

谢谢你的帮助


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

非常重要的编辑:我刚刚意识到这一切是因为在我的示例中,includes/phpFiles/processInput.php中包含了同一目录中的一个文件:require_once(“file in same dir.php”);这就是原因。如果在包含文件时未指定文件名以外的任何内容,则include_路径实际上是写入所需文件的目录。有人能确认吗?

使用绝对路径

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

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

您使用的是相对路径。您需要使用绝对路径:
$\u服务器['DOCUMENT\u ROOT']

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

因此,如果file1.php(位于
根目录中)包含:

require("folder/file.php");
file2.php中包含file1.php(位于不同的位置(例如
文件夹
目录):

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...

除其他外,您可以通过以下几种方式实现:

  • 用于控制从何处执行
    require()
    调用的目录

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

  • 在任何地方都使用相对路径,并利用
    dirname(\uuuuu FILE\uuuuuuuuu)
    \uuuuuuu DIR\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    将它们转换为绝对路径。例如:
    require(\uuuuuuu

  • 默认情况下,当前工作目录用于include路径;您可以通过检查
    get\u include\u path()
    的输出来验证这一点。但是,这与
    include()
    的制作位置无关;它与主执行脚本相关。

    index.php:

    require_once("includes/template.php");
    
    require_once("includes/template.php");
    
    template.php:

    require_once("includes/phpFiles/processInput.php")
    
    require_once("includes/phpFiles/processInput.php")
    
    您的目录结构已关闭。正在从使用它的文件中查看文件包含。因此,“template.php”正在其当前文件夹(/includes/)中查找“includes/”文件夹

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

    require_once("phpFiles/processInput.php")
    
    在您的template.php文件中(如果您移动东西,它很可能会损坏,这就是为什么其他人都建议使用来自文件系统根目录的绝对路径)

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

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

    是的,它会的。我只是想相对地做。一个原因是它应该很容易转移。奇怪的是,我在一个类文件夹中包含了类。它还包括了其他应该包含的文件,即使路径是相对的。因为
    $\u SERVER['DOCUMENT\u ROOT']
    始终存在,无论您在哪台服务器上,都应该没有问题。唯一的问题是,如果这是针对不在文档根目录中的某种应用程序,那么您必须定义一个常量,告诉脚本应用程序的根目录在哪里。为什么我需要使用绝对路径?您写道:require(“folder/file.php”);//但是因为file2.php已经在
    文件夹
    目录中,所以这个路径不存在……但是如果你在file2.php中包含一个file3.php,那么这个文件就不会遵循这个规则。它将包括我希望它做的方式。为什么它会区分使用母脚本include path和当前脚本include path这两个包含路径呢包括三个?@StudentofHogwarts你看过的那些课程可能会利用我的观点#3@StudentofHogwarts更新了我的答案;基本上,您误解了include系统;-)所以include_path只是主脚本的include路径。:)