在我的代码的许多地方,我做的事情如下:
file1.php:
<?php
include('../file2.php');
file2.php:
<?php
include('anotherdirectory/file3.php');
根据我尝试此操作的服务器或设置,它可以设置“包含者”或“包含”的相对路径。这真令人困惑。 所以file1可能会尝试包含“../anotherdirectory/file3.php”,或者它可能会尝试“anotherdirectory / file3.php”。
什么设置决定了这种行为?我希望控制这个......
答案 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也会查找匹配文件。
如果您包含一个文件,其中包含另一个文件,则“根”路径是该文件的路径,其中首先包含另一个文件。