2011-08-17 46 views
3

我在故障与/ VS ./ VS ../和绝对和相对路径

/ 
/client/ 
/user/ 
/config/ 
etc... 

我希望我的所有文件,包括/user/codestart.php许多PHP文件。

因此(功能等批):

  • /所有文件都include("./user/codestart.php");
  • /user/所有文件都include("codestart.php");
  • 中的所有文件/client/include("../user/codestart.php");

问题是/user/codestart.phpinclude("../config/config.php");(M ySQL ID和密码)

/中的文件运行时,如/index.php,它包括./user/codestart.php。 然后/user/codestart.php包括../config/config.php,但它不能看到它,因为它认为它从/而不是从/user/调用它。

如果我改变 include("../config/config.php")include("./config/config.php") 修复它为/文件,但打破它为/user//client/文件。

底线是,当一个PHP文件包含另一个文件时,PHP认为它是从原始文件的位置运行,而不是调用文件。

我需要使用相对路径,而不是绝对路径。绝对路径在我的情况下不起作用。

有什么办法解决这个问题吗?

+3

问:“有什么办法解决这个问题?”答:使用绝对路径。问:“我不想使用绝对路径。” A:哦。 –

+0

我看到你编辑添加“绝对路径不会在我的情况下工作” - 你能解释一下吗?看到,麻烦在于,绝对路径在所有情况下都有效 - 这种说法是荒谬的。你能否解释一下你认为这种情况是否排除了对问题最合理的解决方案?请详细说明 - 我想帮忙,但这根本没有任何意义。 –

回答

1

一种方法是这样的:

  • 有一个中央配置文件(例如:/myproject/config/bootstrap.php

  • 在该配置文件中,为您的应用程序定义一个全局根,例如

    define("APP_ROOT", realpath(dirname(__FILE__)."/..")); 
    
  • 将该配置文件包含在每个PHP文件中。例如。

    include("../config/bootstrap.php"); 
    
  • 每当您引用一些其他的文件,使用

    include APP_ROOT."/includes/somefile.php"; 
    

瞧 - 你有空间(APP_ROOT)一个固定点,并可以不管引用的一切相对的是,哪个目录你在。

+0

是的,并且使用其他任何方式从所有文件中包含此配置? – RiaD

+0

@RiaD你必须指定配置文件的完整相对路径(除非你想设置一个全局'include_path'或其他东西)。这意味着如果您移动文件,您必须更改相对路径 - 这是一个可接受的折衷IMO,因为这不会经常发生。 –

0

可以在连词使用相对路径与目录名(__FILE__

所以在你Codestart的文件写入:

require_once dirname(__FILE__).'/../config/config.php'; 
0

使用绝对路径。得到你的根目录的路径使用$_SERVER['DOCUMENT_ROOT'],前。

include $_SERVER['DOCUMENT_ROOT'].'/user/codestart.php'; 
include $_SERVER['DOCUMENT_ROOT'].'/config/config.php'; 

它使您免于绝对路径的问题。

+0

依赖于'DOCUMENT_ROOT'的缺点是您可以将您的应用程序仅放置在文档根目录下,而不是子目录。在很多情况下都很好,但我从来没有使用过它,因此 –

+0

@Pekka:如果您知道document_root与真实根目录的相对位置,您也可以使用$ _SERVER ['DOCUMENT_ROOT']。'../.....' – RiaD

1

如果你想这样做,我建议你为所有包含在固定目录中的所有包含(例如根目录)创建一个单独的文件。

然后你确实包括从那里使用

include __DIR__.'path/relative/from/includefile.php' 

如果你的PHP优化版本是低于5的所有文件。3,你应该使用dirname(__FILE__)代替__DIR__里亚德

提到你可能想解决这个问题this php.net page

+1

需要PHP 5.3使用'dirname(__ FILE __)'而不是PHP 5.2或更高版本 – RiaD

0

您可以设置PHP用来查找文件的路径,以便它包含您的所有文件夹。在index.php

$folders = implode(PATH_SEPARATOR, array('user', 'config')); 
set_include_path(get_include_path().PATH_SEPARATOR.$folders); 

然后,你可以这样做:

include("codestart.php"); 

和:

include("config.php"); 

这将为index.php工作和所有文件index.php包括。