为什么这个PHP相对包含失败?

时间:2011-06-12 01:05:49

标签: php include-path

disc@puff:~/php$ ls 
a.php  data  include 

disc@puff:~/php$ tree 
. 
├── a.php 
├── data 
│   └── d.php 
└── include 
    ├── b.php 
    └── c.php 
2 directories, 4 files 

disc@puff:~/php$ cat a.php 
a.php is including include/b.php ... 
<?php include "include/b.php" ?> 

disc@puff:~/php$ cat include/b.php 
b.php is including c.php and ../data/d.php ... 
<?php include "c.php" ?> 
<?php include "../data/d.php" ?> 

disc@puff:~/php$ cat include/c.php 
c.php 

disc@puff:~/php$ cat data/d.php 
d.php 

disc@puff:~/php$ php a.php 
a.php is including include/b.php ... 
b.php is including c.php and ../data/d.php ... 
c.php 
PHP Warning:  include(../data/d.php): failed to open stream: No 
such file or directory in /home/disc/php/include/b.php on line 3 
PHP Warning:  include(): Failed opening '../data/d.php' for 
inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/ 
disc/php/include/b.php on line 3 

disc@puff:~/php$ 

为什么include "c.php"成功但include "../data/d.php"失败?

http://www.php.net/manual/en/function.include.php提到:“如果有路径 定义 - 是否绝对(以驱动器号或\开头 Windows,或/在Unix / Linux系统上)或相对于当前 目录(以。或..开头) - include_path将被忽略 共。例如,如果文件名以../开头,那么解析器 将查看父目录以查找所请求的文件。 “

父目录是什么?

2 个答案:

答案 0 :(得分:2)

路径始终相对于被调用的脚本。在你的例子中加载c.php是因为“。” (当前目录)始终位于include_path中。

要解决此问题,您可以使用dirname(__FILE__)始终知道文件本身的目录。 (您编写文件的文件)

或者您可以使用dirname($_SERVER['SCRIPT_FILENAME'])来获取校准脚本的目录。

答案 1 :(得分:1)

当您从a.php开始时,您应该在a.php中定义包含目录:

define('MY_INCLUDES', dirname(__FILE__) . '/include/');
define('MY_DATA', dirname(__FILE__) . '/data/');

然后包含具有绝对路径的文件:

include(MY_INCLUDES . 'b.php');
include(MY_DATA . 'c.php');