如何包含需要绝对path的PHP文件?

我有一个如下的目录结构;

script.php的

INC / include1.php
INC / include2.php

对象/ object1.php
对象/ object2.php

SOAP / soap.php

现在,我在script.php/soap/soap.php使用这些对象,我可以将它们移动,但是由于特定的原因我想要这样的目录结构。 当执行script.php ,includepath是inc/include.php ,当执行/soap/soap.php它是../inc ,绝对path工作, /mnt/webdev/[project name]/inc/include1.php...但是如果我想将目录移动到不同的位置,这是一个难看的解决scheme。

那么有没有办法使用相对path,或者是以编程的方式生成"/mnt/webdev/[project name]/"

这应该工作

 $root = realpath($_SERVER["DOCUMENT_ROOT"]); include "$root/inc/include1.php"; 

编辑:通过aussieviking添加imporvement

你可以使用相对path。 试试__FILE__ 。 这是一个PHP常量,它总是返回它所在脚本的path/文件名。所以,在soap.php ,你可以这样做:

 include dirname(__FILE__).'/../inc/include.php'; 

文件的完整path和文件名。 如果在include中使用,则返回包含文件的名称。 从PHP 4.0.2开始, __FILE__总是包含一个parsing了符号链接的绝对path,而在旧版本中,它包含了在某些情况下的相对path。 (资源)

另一个解决scheme是在你的httpd.conf或.htaccess文件中设置includepath

看看http://au.php.net/reserved.variables

我认为你正在寻找的variables是: $_SERVER["DOCUMENT_ROOT"]

你可以定义一个常量到项目根目录的path,然后把它放在path的开头。

解决这个问题的另一种方法就是使用自动加载function。 包括您的脚本需要的一切“在情况下”可能会阻碍性能。 如果你的包含的都是类或接口的定义,并且你只想在需要的时候加载它们,你可以用你自己的代码重载__autoload()函数来find合适的类文件,并且只有在被调用的时候才加载它。 以下是手册中的示例:

 function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new MyClass1(); $obj2 = new MyClass2(); 

只要您相应地设置了include_pathvariables,就不需要再次包含类文件。

另一个与凯文相关的选项是使用__FILE__ ,而不是从其中取代php文件名:

 <?php $docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__); require_once($docRoot . '/lib/include.php'); ?> 

我一直在使用这个。 唯一的问题是有时你没有$_SERVER['SCRIPT_NAME'] ,但有时候会有另外一个variables类似。

我发现这个工作得很好!

 function findRoot() { return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1))); } 

使用:

 <?php function findRoot() { return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1))); } include(findRoot() . 'Post.php'); $posts = getPosts(findRoot() . 'posts_content'); include(findRoot() . 'includes/head.php'); for ($i=(sizeof($posts)-1); 0 <= $i; $i--) { $posts[$i]->displayArticle(); } include(findRoot() . 'includes/footer.php'); ?> 
 require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php"); 

我使用这行代码。 它返回到站点树的“顶部”,然后转到所需的文件。

例如,假设我有这个文件树:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

我可以从任何地方包括functions.php文件,只需通过复制粘贴即可

 require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php"); 

如果你需要多次使用这个代码,你可以创build一个返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))部分str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) 。 然后,只需在你包含的第一个文件中插入这个函数。 我有一个“initialize.php”文件,我包括在每个PHP页面的顶部,其中包含此function。 下一次我必须包含文件,我实际上只是使用函数(名为path_back ):

 require(path_back()."/_resources/another_php_file.php"); 

我认为最好的方法是把你的包含在你的PHP包含path。 有多种方法可以根据您的设置来执行此操作。

那么你可以简单地参考

 require_once 'inc1.php'; 

从任何文件的内部,无论是在你的包含或在你的网页访问文件,或任何级别的嵌套子目录。

这使您可以将您的包含文件放在Web服务器根目录之外,这是最佳做法。

例如

 site directory html (web root) your web-accessible files includes your include files 

此外,检查出__autoload延迟加载类文件

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

@Flubba,这是否允许我在我的包含目录中的文件夹? 平面包含目录给我做恶梦。 因为整个对象目录应该位于inc目录中。

哦,是的,绝对。 因此,例如,我们使用单层子文件夹,通常:

 require_once('library/string.class.php') 

在真正高stream量的站点上,你需要非常小心地使用包含path,因为php不得不search当前目录,然后search包含path上的所有目录,以查看你的文件是否存在,事情起来,如果你正在锤打。

所以,举个例子,如果你在做MVC,你会把path放到你的应用程序中,在includepath中,然后指定表单中的东西

 'model/user.class' 'controllers/front.php' 

pipe他呢。

但是一般来说,它只是让你在你的PHP中使用真正短的path,它可以在任何地方工作,而且比实际path的文档根目录malarkey更容易阅读。

其他人提出的基于脚本的替代scheme的好处是他们可以在任何地方工作,甚至在共享的盒子上工作。 设置包含path需要更多的思想和努力,但正如我所提到的,让你开始使用__autoload这是最酷的。

更短的路

 include($_SERVER['DOCUMENT_ROOT']."/inc/include1.php"); 

'DOCUMENT_ROOT':在服务器configuration文件中定义的当前脚本执行的文档根目录。