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

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

script.php

inc/include1.php
inc/include2.php

objects/object1.php
objects/object2.php

soap/soap.php

现在,我在 script.php/soap/soap.php 中使用这些对象,我可以移动它们,但是我想要一个特定的目录结构。执行 script.php 时,include路径是 inc / include.php ,执行 /soap/soap.php 时,它是 .. / inc ,绝对路径工作, / mnt / webdev / [项目名称] /inc/include1.php ... 但是,如果我想将目录移动到一个不同的位置。

那么是否有一种方法可以使用相对路径,或者是以编程方式生成“/ mnt / webdev / [项目名称] /”的方法?

0

10 答案

您可以使用相对路径。试试 __ FILE __ 。这是一个PHP常量,它总是返回它所在脚本的路径/文件名。因此,在 soap.php 中,你可以这样做:

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

完整的路径和文件名   文件。如果在包含内使用,则   包含文件的名称被返回。   自PHP 4.0.2以来,始终是 __ FILE __   包含一个绝对路径   符号链接解决了,而在旧的   它包含相对路径的版本   在某些情况下。   (source)

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

0
额外
我想你应该在带引号的表达式的开头添加一个 / ,以将 ..FILE 名称分开。
额外 作者 Dunaril,
请注意,从PHP 5.3.0开始,您可以使用魔术常量 __ DIR __ ,而不必使用 dirname(__ FILE __)(PHP文档)
额外 作者 Erwin Wessels,
include dirname(__ FILE __)。'/ .. / inc / include.php'; 不要忘记相对路径前面的“/”。
额外 作者 Steven Leimberg,

您可以使用到项目根目录的路径定义常量,然后将其放在路径的开头。

0
额外

我认为最好的方法是把你的包含在你的PHP包含路径中。根据您的设置,有多种方法可以做到这一点。

然后你可以简单地参考

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 +包括+路径

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

0
额外
    

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

  

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

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

在真正高流量的网站中,你需要非常小心依赖包含路径,因为php不得不搜索当前目录,然后搜索包含路径中的所有目录,以查看你的文件是否存在,这可能会减慢如果你受到重击,事情就会发生。

因此,例如,如果你在做MVC,你会把你的应用程序directoy的路径放在包含路径中,然后指定表单中的事物

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

管他呢。

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

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

0
额外

这应该工作

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

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

Edit: added imporvement by aussieviking

0
额外
只是一个问题,为什么realpath()为$ _SERVER [“DOCUMENT_ROOT”]?这不应该总是输出规范的路径?
额外 作者 João Pimentel Ferreira,
请注意,如果您通过填充 DOCUMENT_ROOT 的Web服务器执行脚本,
额外 作者 Phil,

另一个与凯文相关的选项是使用 __ FILE __ ,但是替换其中的php文件名:

<?php

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

?>

我一直在使用这一点。唯一的问题是有时你没有 $ _ SERVER ['SCRIPT_NAME'] ,但有时候会有另一个类似的变量。

0
额外

have a look at http://au.php.net/reserved.variables

I think the variable you are looking for is: $_SERVER["DOCUMENT_ROOT"]

0
额外

处理这个问题的另一种方法是消除所有需要,包括使用自动加载功能。包括您的脚本需要的所有内容“在案例中”可能会妨碍性能。如果您的includes包含所有类或接口定义,并且只想在需要时加载它们,则可以使用自己的代码重载 __ autoload()函数以查找相应的类文件并仅在它被称为。以下是手册中的示例:

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

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

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

0
额外

我发现这个工作非常好!

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

?>
0
额外

如果您要在应用程序的大部分文件中包含特定路径,请为根文件夹创建一个全局变量。

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

现在这个全局变量“ APPLICATION_PATH ”可以用来包含所有文件,而不是每次包含新文件时调用realpath()。

EX:

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

希望能帮助到你 ;-)

0
额外