我有一个目录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的文件所在的目录。可以有人确认吗?
答案 0 :(得分:5)
使用绝对路径。
require_once($_SERVER['DOCUMENT_ROOT']."/includes/phpFiles/processInput.php");
对所有require
d文件使用类似的表单,无论您身在何处,它们都能正常运行。
答案 1 :(得分:2)
您可以通过以下几种方式实现这一目标:
使用set_include_path
来控制执行require()
来电的目录。
在index.php
中定义的常量中定义公共绝对基本路径,并在每个require()
语句中使用它(例如require(BASEPATH . '/includes/template.php')
)。
在任何地方使用相对路径,并利用dirname(__FILE__)
或__DIR__
将其转换为绝对路径。例如:require(__DIR__ . '/phpFiles/processInput.php');
默认情况下,当前工作目录在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/');