php嵌套包含行为

时间:2010-05-18 18:54:23

标签: php include relative-path

在我的代码的许多地方,我做的事情如下:

file1.php:
<?php
include('../file2.php');

file2.php:
<?php
include('anotherdirectory/file3.php');

根据我尝试此​​操作的服务器或设置,它可以设置“包含者”或“包含”的相对路径。这真令人困惑。 所以file1可能会尝试包含“../anotherdirectory/file3.php”,或者它可能会尝试“anotherdirectory / file3.php”。

什么设置决定了这种行为?我希望控制这个......

4 个答案:

答案 0 :(得分:11)

如果我需要使用相对路径,请使用以下语法:

include (realpath(dirname(__FILE__)."/another_folder/myfile.php"));

答案 1 :(得分:8)

我建议使用绝对路径。在可移植的同时执行此操作的一个好方法是在public_html / index.php中进行如下声明:

define('ROOT', dirname(__FILE__));

然后,您可以编写包含这样的内容非常简单:

include(ROOT.'/file.php');

否则,PHP会检查文件是否在php.ini定义的include path中。如果它不存在,它会尝试当前脚本的相对路径。这是不可预测和不可维护的,因为您可能正在包含来自不同相对位置的文件。

编辑:如果您经常包含大量课程文件,则可能需要查看autoloading。如果您以面向对象的方式编程,它会使一切变得简单。我个人从未在我的代码中写过“包含”这个词很长一段时间。

编辑2:您可以使用php.ini directive auto_prepend_file自动包含一个单行文件,其中包含每个脚本的ROOT定义。

答案 2 :(得分:2)

作为php学习曲线上的某人,我发现通过使用内置的$ _SERVER超全局,引用包含路径的最佳方式是绝对位置,而不是相对位置。在我自己的文件中,我一直在成功使用它:

include $_SERVER [ 'DOCUMENT_ROOT' ] . '/path_from_root/file_name.php';

这样,包含文件相对于我的调用文件所在的位置并不重要,我不必担心手动输入我的完全限定服务器路径。 (可能很明显..)无论嵌套如何嵌套,以及是否/当我将调用文件移动到另一个目录时,这都会有效。

您可以将此方法与include,require和任何其他需要路径的文件相关的函数一起使用。

相关说明..

$_SERVER [ 'PHP_SELF' ]

将返回当前文件的路径(相对于根)。我也用了很多。

$ _ SERVER还有其他有用的信息,您可以在这里查看:

http://php.net/manual/en/reserved.variables.server.php

很抱歉,如果这是一个较旧的帖子,我是新来的。

编辑:您可以将此“DOCUMENT_ROOT”保存到变量中以供日后使用,但从最近的经验我会建议不要使用它,因为那时您必须担心变量范围。无论当前范围如何,所写的包含行都会有效。

答案 3 :(得分:0)

使用get_include_path(),您可以看到,服务器配置是什么。在大多数情况下,它看起来像这样:

.:/usr/lib/php

这意味着,php正在寻找包含文件的第一个地方是包含另一个文件的脚本目录。如果它不在那里,php正在查找/ usr / php / lib。如果你添加更多路径,php也会查找匹配文件。

如果您包含一个文件,其中包含另一个文件,则“根”路径是该文件的路径,其中首先包含另一个文件。