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


95

我的目录结构如下:

script.php

inc / include1.php
inc / include2.php

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

soap / soap.php

现在,我在script.php和中都使用了这些对象/soap/soap.php,可以移动它们,但是出于特定的原因,我想要这样的目录结构。当执行script.php包含路径is inc/include.php和执行/soap/soap.php它时../inc,绝对路径有效,/mnt/webdev/[project name]/inc/include1.php...但是如果我想将目录移动到其他位置,则这是一个丑陋的解决方案。

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

Answers:


149

这应该工作

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

编辑:通过aussieviking添加了改进


2
请注意,仅当您通过填充的网络服务器执行脚本时,此方法才起作用DOCUMENT_ROOT
Phil

只是一个问题,为什么$ _SERVER [“ DOCUMENT_ROOT”]的realpath()?这将不会始终输出规范路径吗?
若奥·皮门特尔·费雷拉

44

您可以使用相对路径。尝试__FILE__。这是一个PHP常量,始终返回其所在脚本的路径/文件名。因此,在中soap.php,您可以执行以下操作:

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

文件的完整路径和文件名。如果在include中使用,则返回包含文件的名称。从PHP 4.0.2开始,__FILE__始终包含已解析符号链接的绝对路径,而在旧版本中,在某些情况下,它包含相对路径。 (资源)

另一个解决方案是在httpd.conf或.htaccess文件中设置包含路径


8
我认为您应该/在带引号的表达式的开头添加一个,以将FILE名称..FILE名称分开。
达纳里尔2011年

9
请注意,自PHP 5.3.0起,您可以使用magic常量,__DIR__而不必使用dirname(__FILE__)(PHP文件)
Erwin Wessels,2012年

3
include dirname(__FILE__).'/../inc/include.php';不要忘记相对路径前的“ /”。
Steven Leimberg 2014年

6

解决此问题的另一种方法完全不需要包含,那就是使用自动加载功能。包括脚本需要的所有内容“以防万一”可能会妨碍性能。如果包括所有类或接口定义,并且只想在需要时才加载它们,则可以__autoload()使用自己的代码重载该函数以查找适当的类文件并仅在调用它时加载它。这是手册中的示例:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

只要您相应地设置了include_path变量,就无需再包含类文件。




2

与Kevin相关的另一种选择是use __FILE__,但是从其中替换php文件名:

<?php

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

?>

我已经使用了一段时间了。唯一的问题是有时您没有$_SERVER['SCRIPT_NAME'],但有时还有另一个类似的变量。


2

我发现这很好用!

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');

?>

1

我认为最好的方法是将您的include放入您的PHP include路径。有多种方法可以执行此操作,具体取决于您的设置。

那你可以简单地参考

require_once 'inc1.php';

从任何文件内部访问,而不管它在您的包含文件中还是在Web可访问文件中,或者在任何级别的嵌套子目录中。

这使您可以将包含文件置于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=__自动加载


1
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");

如果您需要多次使用此代码,则可以创建一个返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))零件的函数。然后只需将此功能插入您包含的第一个文件中即可。我有一个“ initialize.php”文件,该文件包含在每个php页面的顶部,并且包含此功能。下次我必须包含文件时,实际上我只使用了函数(名为path_back):

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

0

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

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

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

您需要小心,在真正高流量的站点中过多依赖包含路径,因为php必须先遍历当前目录,然后遍历包含路径中的所有目录才能查看文件是否存在,这可能会减慢速度如果您受到重击,事情就会变得更糟。

因此,例如,如果您正在执行MVC,则可以将应用程序目录的路径放置在包含路径中,然后以以下形式指定引用内容

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

管他呢。

但总的来说,它只允许您在PHP中使用真正的短路径工作,该路径可以在任何地方工作,并且比所有realpath文档根目录malarkey都易于阅读。

其他人建议的那些基于脚本的替代方案的好处是,它们即使在共享的盒子上也可以在任何地方工作;设置包含路径需要更多的思考和精力,但是正如我提到的,您可以开始使用__autoload,它是最酷的。


0

如果要在应用程序的大多数文件中包含特定路径,请在根文件夹中创建一个Global变量。

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

现在,此全局变量“ APPLICATION_PATH ”可用于包含所有文件,而不必在每次包含新文件时都调用realpath()。

例如:

include(APPLICATION_PATH ."/config/config.ini";

希望能帮助到你 ;-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.