97

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

脚本.php

inc/include1.php
inc/include2.php

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

肥皂/soap.php

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

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

4

11 回答 11

154

这应该工作

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

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

编辑:通过aussieviking增加改进

于 2008-08-07T04:20:47.647 回答
46

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

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

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

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

于 2008-08-07T05:05:34.093 回答
6

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

我认为您正在寻找的变量是:$_SERVER["DOCUMENT_ROOT"]

于 2008-08-07T04:25:22.473 回答
6

另一种完全不需要包含的处理方法是使用自动加载功能。包括脚本所需的一切“以防万一”可能会妨碍性能。如果您的 include 都是类或接口定义,并且您希望仅在需要时加载它们,则可以__autoload()使用自己的代码重载该函数以找到适当的类文件并仅在调用时加载它。这是手册中的示例:

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

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

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

于 2008-09-18T14:28:50.463 回答
5

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

于 2008-08-07T04:04:55.103 回答
2

另一个与 Kevin 相关的选项是 use __FILE__,而是从其中替换 php 文件名:

<?php

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

?>

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

于 2008-09-09T22:49:56.777 回答
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');

?>
于 2012-02-10T19:00:40.330 回答
1

我认为最好的方法是将您的包含放在您的 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+include+path

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

于 2008-08-07T19:20:00.933 回答
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");
于 2015-04-13T14:33:59.720 回答
0

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

哦,是的,绝对的。所以例如我们使用单层子文件夹,一般是:

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

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

因此,例如,如果您正在执行 MVC,则将应用程序目录的路径放在包含路径中,然后在表单中指定引用事物

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

管他呢。

但一般来说,它只是让您在 PHP 中使用非常短的路径,可以在任何地方工作,而且它比所有 realpath 文档根目录更容易阅读。

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

于 2008-08-08T23:17:12.273 回答
0

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

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

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

前任:

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

希望能帮助到你 ;-)

于 2018-05-09T10:10:21.403 回答