嵌套`include()`指令 - 如何从多个目录中包含一个文件(包括另一个)?

时间:2011-05-31 11:43:41

标签: path include php include-path

我可以使用这三个文件:

document_root/include/config.php
document_root/include/database.php
document_root/index.php

文件内容的相关部分如下:

的config.php

// ...
$MyVar = 100;
// ...

database.php中

// ...
require('config.php');
// Aiming to use the definitions in "config.php" here
// ...

的index.php

// ...
require('include/database.php');
// Using the code in "database.php" here
// ...

问题是,config.php以某种方式不包括在内,但没有给出错误消息(在E_ALL模式下)。在config.php中运行代码时,我无法访问database.php文件中index.php文件中的定义。

在我的PHP.ini文件include_path中设置为C:\...\document_root\include目录 PHP版本是5.3.0。

我观察到,如果我将require()指令更改为database.php require('include/config.php'); 代码运行没有任何失败,一切都很好。但是这种解决方案在实践中是不可能的,因为我计划在多个位置包含config.php文件。

这个问题的原因是什么?
我该如何解决?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

此问题的原因是,include根据工作目录解析相对文件名,而不是基于文件所在的目录include

工作目录是网络服务器启动的PHP文件的目录(在你的情况下是index.php我猜)。如果该文件包含其他文件,则不会更改工作目录。它可以使用chdir手动更改,但您不应仅仅为了include而这样做。

一种可能的解决方案是使用

include dirname(__FILE__) . DIRECTORY_SEPARATOR . '[RELATIVE_PATH]';

其中[RELATIVE_PATH]是从包含文件的文件到包含的文件的相对路径。

在PHP 5.3中,可以使用__DIR__代替dirname(__FILE__)