我有一个像下面这样的目录结构;

script.php的

INC / include1.php
INC / include2.php

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

SOAP / soap.php

现在,我在script.php/soap/soap.php使用这些对象,我可以移动它们,但出于特定原因我想要这样的目录结构。 执行script.php ,include路径为inc/include.php ,执行/soap/soap.php它是../inc ,绝对路径工作, /mnt/webdev/[project name]/inc/include1.php...但它是一个丑陋的解决方案,如果我曾经想要的目录移动到不同的位置。

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

===============>>#1 票数:146 已采纳

这应该工作

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

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

编辑:通过aussieviking增加了改进

===============>>#2 票数:43

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

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

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

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

===============>>#3 票数:6

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

我认为你要找的变量是: $_SERVER["DOCUMENT_ROOT"]

===============>>#4 票数:5

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

===============>>#5 票数:5

处理此问题的另一种方法是删除对包含的任何需求,即使用自动加载功能。 包括脚本需要的所有内容“Just in Case”会阻碍性能。 如果您的包含是所有类或接口定义,并且您只想在需要时加载它们,则可以使用您自己的代码重载__autoload()函数以查找相应的类文件,并仅在调用它时加载它。 以下是手册中的示例:

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

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

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

===============>>#6 票数:2

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

<?php

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

?>

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

===============>>#7 票数: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');

?>

===============>>#8 票数: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))部分str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) 然后只需在您包含的第一个文件中插入此函数。 我有一个“initialize.php”文件,我包含在每个php页面的最顶层,其中包含此功能。 下次我必须包含文件,我实际上只是使用该函数(名为path_back ):

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

===============>>#9 票数: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

===============>>#10 票数: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";

希望能帮助到你 ;-)

===============>>#11 票数:0

@Flubba,这允许我在include目录中有文件夹吗? 平包括目录让我做恶梦。 因为整个对象目录应该在inc目录中。

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

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

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

因此,例如,如果您正在进行MVC,那么您将把包含路径中的应用程序路径直接放入,然后指定引用表单中的内容

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

管他呢。

但一般来说,它只是让你可以在你的PHP中使用非常短的路径,它可以在任何地方工作,并且它比所有的真实路径文件根malarkey更容易阅读。

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

  ask by Xenph Yan translate from so

未解决问题?本站智能推荐:

3回复

PHP包含文件作为绝对路径-这正确吗?

我在某些页面上包含了php的几个实例(通常使用页脚标记和标题等内容),并且Id使用了绝对的php路径,而不是我使用的../../相对路径。 我认为这可以工作: 我的问题是:/dir/script_name.php是确切的完整路径,如果是,那么__FILE__ ?的意义是__FI
3回复

PHP包含绝对路径

我的网站上有一个名为$ basePath的变量,其设置为: 我在所有的css,js和images标签上都使用了它(为了更好的可见性而缩短了): 我对这些包含项没有任何问题,它们在任何文件和任何文件夹中都可以正常工作。 我有一个包含的页面,其中包含以下行: 图像显示得
1回复

PHP:无法使用绝对路径在包含/需要文件中定义变量

我发现很难访问包含文件中定义的变量。 我的包含文件位于根目录中,并且具有变量$x : localhost/dir_name/include.php 我在子目录中的file.php包括了include.php文件: localhost/dir_name/sub_directo
2回复

如何始终使用PHP包含绝对路径的文件

具有所需文件中包含的文件。 我遇到的问题是仅当用户位于站点根目录上的页面上时,包含的文件才能工作。 但是如果te用户分支到子目录,他们会收到错误消息 无法打开流:没有这样的文件或目录 这就是我目前在所需文件中包含该文件的方式。 所以我尝试了一些没用的东西 第一
4回复

在包含的php文件中使用绝对路径的替代方法

我有一个名为“header.php”的文件,我在我的网站上的每个页面都包含这个文件,这个文件包含我的服务器上的其他文件的链接,如css文件,jquery插件等等。现在我使用绝对路径这些链接,所以他们将使用与header.php文件不在同一目录中的文件,这是有效的,但正如您在下面的示例中所看到的,
4回复

PHP通过包含文件传递变量(相对路径与绝对路径)

我想将包含文件identity.php中定义的变量传递给父文件,我将其称为parent.php 。 当我通过它的相对路径包含identity.php时,该变量可用于parent.php文件。 当我通过它的绝对路径(到应用程序根目录)包含identity.php时 ,它不起作用。 为什么是这
3回复

PHP的绝对路径

我有一个问题,因为当我的网站为www.site.com/shop时,我无法处理图像或CSS 情况:我有这些文件夹,包括img css js 在我的根文档中,我拥有并包括所有的styles.css,脚本和元数据。 到目前为止,所有文档都可以在根文档中使用,但是现在我有了一个名为s
1回复

为什么PHP包含文件包含在绝对路径包含的文件中,但不能包含相对路径? [关闭]

我的网络根目录下的inc目录中包含以下三个文件: a.php b.php c.php 在a.php ,我有以下代码: 如果我使用绝对路径在inc目录之外的另一个文件中包含a.php ,则b.php和c.php的include语句可以c.php工作。 但
1回复

定义PHP包含的绝对路径[重复]

这个问题已经在这里有了答案: APP_ROOT定义不正确 2回答 从文件读取(必需) 3个答案 使用require_once的路径错误 2个答案 PHP root与.htaccess 1个答案 由于我更改树,绝对路径和相对路径不起作用 2
1回复

PHP包含和相对/绝对路径不起作用

在我的站点中index.php位于/目录中,然后我还有其他几个.php文件位于/ episodes / 10 /中(第10集是情节编号)。 我到index.php中的include的路径就是<?php include "includes/head.php"; ?> <?