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路径。:)