Почему этот относительный PHP включает сбой? - PullRequest
3 голосов
/ 12 июня 2011
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 ]

2 голосов
/ 12 июня 2011

пути всегда относятся к вызываемому скрипту.в вашем примере c.php загружается, потому что "."(текущий каталог) всегда находится в include_path.

, чтобы исправить это, вы можете использовать dirname(__FILE__), чтобы всегда знать каталог самого файла.(файл, в котором вы пишете FILE )

или вы можете использовать dirname($_SERVER['SCRIPT_FILENAME']), чтобы всегда получать каталог скрипта вызова.

1 голос
/ 12 июня 2011

Поскольку вы начинаете с 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');
...