想象一下,父目录中有两个目录, foo 和 bar ,这些目录包含一些PHP文件:
/
/index.php
/foo
/foo/functions.php
/foo/stuff.php
/bar
/bar/doodie.php
让我们说:
functions.php
包含stuff.php
index.php
包含functions.php
doodie.php
包含functions.php
基于此结构,当index.php
运行时,它将在/foo/functions.php
目录中查找/foo
。 但,必须根据stuff.php
的位置使用相对路径包含index.php
。这适用于运行index.php
的情况。调用doodie.php
时不起作用,因为functions.php
在stuff.php
目录中查找/foo
,当该位置不存在时是/bar
。
是否可以根据文件的位置而不是调用文件来包含文件,而不使用绝对路径(和session variables)?
如果不清楚我很抱歉,描述这个很难......
答案 0 :(得分:1)
你应使用绝对路径。
当然,您不需要每次都包含完整路径。通常的过程是定义一个名为例如APP_PATH的常量,并在引导程序中设置应用程序的绝对路径。
之后,无论何时想要包含文件,都要在include调用中附加APP_PATH常量。这将解决您的问题。
您还可以查看include_path选项,具体取决于文件的位置 - http://php.net/manual/en/function.set-include-path.php
答案 1 :(得分:1)
你可以这样做:
在基本文件夹中创建一个文件;在这个文件中定义这些变量
define('root',SERVER ['DOCUMENT_ROOT']);这确保获得根文件夹
define('foo',root。'/ foo /');这定义了foo文件夹的路径
define('bar',root。'/ bar');这定义了条形文件夹的路径
现在,在您需要调用的任何文件中,包括基本文件,并且您可以访问任何这些文件夹中的任何文件。
所以,如果你已经在/bar/doodie.php中,只需要包含(foo。'functions.php'),反之亦然。
希望有所帮助。
答案 2 :(得分:0)
我建议你去许多MVC的路线。它简单而可靠。只需将所有请求重定向到一个文件,形式为index.php?path = database.php(比如说bootstrap.php),它位于根目录中,然后定义路径。这是我在自制的MVC框架中使用的文件示例。
/**
* BASE_PATH is for server side inclusions.
* BASE_URL is for client side inclusions (scripts, css files, images etc.)
*/
define("DS", DIRECTORY_SEPARATOR);
define("BASE_PATH", dirname(realpath(__FILE__)).DS);
define("BASE_URL", dirname(realpath($_SERVER["SCRIPT_NAME"])).DS);
define("APP_PATH", BASE_PATH."application".DS);
//$url = $_GET['base_url'];
/**Include core file which loads all necessary files */
require_once (BASE_PATH."core".DS."core.php");
这里是core.php(只有一行,因为它有很多行)
//Load config files
require_once(BASE_PATH."config".DS."config.general.php");