问题
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$
Why does include "c.php"
succeed but include "../data/d.php"
fail?
http://www.php.net/manual/en/function.include.php mentions: "If a path is defined — whether absolute (starting with a drive letter or \ on Windows, or / on Unix/Linux systems) or relative to the current directory (starting with . or ..) — the include_path will be ignored altogether. For example, if a filename begins with ../, the parser will look in the parent directory to find the requested file. "
Parent directory of what?
回答1:
paths are always relative to the script which got called. in your example c.php is loaded because "." (current directory) is always in the include_path.
to fix this you can use dirname(__FILE__)
to always know the directory of the file itself. (the file in which you write FILE)
or you can use dirname($_SERVER['SCRIPT_FILENAME'])
to alwys get the directory of the caling script.
回答2:
As you're starting with a.php
, you should define the include directories in a.php
:
define('MY_INCLUDES', dirname(__FILE__) . '/include/');
define('MY_DATA', dirname(__FILE__) . '/data/');
Afterwards include the files with absolute paths:
include(MY_INCLUDES . 'b.php');
include(MY_DATA . 'c.php');
来源:https://stackoverflow.com/questions/6319495/why-does-this-php-relative-include-fail